home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / util / misc / gadmget2.lha / GadMget / GadMGet.source.lha / gadmget.c < prev    next >
C/C++ Source or Header  |  1995-08-05  |  103KB  |  4,317 lines

  1. /* GadMGet.c  by Jeremy Friesner -- jfriesne@ucsd.edu  
  2.    Version 2.05, released August 1, 1995*/
  3.  
  4. #ifndef MGET_C
  5. #define MGET_C
  6.  
  7. #define INTUI_V36_NAMES_ONLY
  8. #define MAXFILELINELENGTH 300 
  9. #define MAXFILENAMELENGTH 300 
  10. #define CHAR_NUL        (char)0
  11. #define CHAR_SPACE        (char)32
  12. #define CHAR_NEWLINE         (char)10
  13. #define CHAR_ESCAPE         (char)27
  14. #define CHAR_RETURN         (char)13
  15. #define INVALID 666
  16.  
  17. #define FIND_REQUESTTYPE     0
  18. #define LINELENGTH_REQUESTTYPE     1
  19. #define OUTPUTFILE_REQUESTTYPE     2
  20. #define SELECT_REQUESTTYPE      3
  21. #define DESELECT_REQUESTTYPE    4
  22.  
  23. #define SEARCH_FORWARD         1
  24. #define SEARCH_BACKWARD     2
  25. #define SEARCHTYPE_BOTTOM     1
  26. #define SEARCHTYPE_TOP         2
  27. #define SEARCHTYPE_NEXT     3
  28. #define SEARCHTYPE_PREVIOUS     4
  29. #define SEARCHTYPE_FORWARD     5
  30. #define SEARCHTYPE_BACKWARD     6
  31.  
  32. #define SORTBYDIR          1
  33. #define DIRNAMESIZE         10
  34.  
  35. #define SORTBYNAME         2
  36. #define NAMESIZE         20
  37.  
  38. #define SORTBYDESC         3
  39. #define DESCSIZE         42
  40.  
  41. #define SORTBYSIZE         4
  42. #define SIZESIZE         5
  43.  
  44. #define SORTBYAGE          5
  45. #define AGESIZE          5
  46.  
  47. #define TREESORT           1
  48. #define BUBBLESORT         2
  49.  
  50. #define ACTION_NONE        0x00
  51. #define ACTION_SAVE        0x01
  52. #define ACTION_OUTPUT        0x02
  53.  
  54. #define DEFAULT_EXECNAME    "GadMget"
  55.  
  56. #include "GadMget.h"
  57.  
  58. extern UWORD lastcode;
  59. extern ULONG appwinsig;
  60. extern struct NewGadget mgetNGad[];
  61. extern struct Window *findwindow;
  62. extern struct AppMessage *amsg;
  63. extern struct MsgPort *awport;
  64. extern struct AppWindow *appwin;
  65. extern struct TextAttr listfont;
  66.  
  67. extern LONG lTreeTicker;
  68. extern LONG lTreeSubTicker;
  69. extern char *sTreeWriteHere;
  70. extern char *szTickerString;
  71.  
  72. FILE *fpOut = stdout;
  73. int IntuitionBase; 
  74. ULONG winopenerror, lockscrnerror;
  75. ULONG handlereturn;
  76. BOOL done=FALSE,BStartedFromWB=FALSE;
  77. char windowtitle[95] = "Loading...";
  78.  
  79. char sListFontName[36] = "";
  80. int nListFontSize = 0;  /* Default to a bad value */
  81. char version[] = "$VER: GadMget V2.05";
  82. __far char template[] = "Template:  GadMGet FILE/A,OUTPUT/K,LINELENGTH/K,TOP/K,LEFT/K,\
  83. WIDTH/K,HEIGHT/K,PUBSCREEN/K,WBSCREEN/S,DEFPUBSCREEN/S,NOFILES/S,GETREADMES/S,\
  84. NOPARSE/S,CASESENSITIVE/S,SORTCASESENSITIVE/S,SEARCHCASESENSITIVE/S,NOCOMMAND/S,\
  85. NOSPLIT/S,NOAPPWINDOW/S,COMMAND/K,NOSIMPLEPATHS/S,NOCD/S,HEADER/K,FOOTER/K,\
  86. FONT/K,FONTSIZE/K,KEEPBLANKLINES/S,KEEPGETSORT/S,KEEPFILESORT/S,FILESORT/K,\
  87. GETSORT/K,AMINETPATH/K,EOL/K,COMMENTCHAR/K,OMITCOMMENTS/K,LOADBUFFERS/K,\
  88. CLOSEACTION/K\n";
  89. char pnamestring[20],searchstring[MAXFILELINELENGTH];
  90. char szPubScreenName[40],*pubscreenname = NULL,defDir[200],defFile[40];
  91. char szCommandString[40] = "mget ";
  92. __far char inputfile[MAXFILENAMELENGTH]="ram:RECENT";
  93. const char szBookMark[]="| --- GadMGet: Begin Selected Files --- ";
  94. char sEndOfLineString[10] = "\r\n";
  95. char sAminetPathString[50] = "../../";
  96. __far char sOutFileName[MAXFILENAMELENGTH]="";
  97. __far char szHeaderFile[MAXFILENAMELENGTH];
  98. __far char szFooterFile[MAXFILENAMELENGTH];
  99. char sMultiSelect[150]="";
  100. __far char szFilePattern[50]="#?";
  101. char cCommentChar = '|';
  102.  
  103. char *pcWhatToAbort;
  104. char *pcExecName=NULL;
  105.  
  106. int nTopListTop, nTopListHeight, nBottomListHeight;
  107. int nSortType[2] = {SORTBYDIR, SORTBYDIR};
  108. int nKeepSorted[2] = {FALSE, FALSE};
  109. int Not[2] = {TRUE, FALSE};        /* NOT lookup array */
  110. int nForTreeSortUseOnly;        /* only global because nested functions ain't happenin!  Don't use elsewhere! */
  111. int nLoadBufferSize = 30 * 1024;     /* default = 30k */
  112. int nCloseAction = ACTION_OUTPUT;    /* default = output on close box click */
  113.  
  114. struct List *lForTreeSortUseOnly;
  115.  
  116. static char *szLoadBuffer1 = NULL;
  117. static char *szLoadBuffer2 = NULL;
  118. static char *szLoadBuffer3 = NULL;
  119. static char *szLoadBufferT = NULL;
  120. static char *pcLoadCurrent = NULL;
  121. static char *pcEOFat       = NULL;
  122.  
  123. /* Input column info */
  124. static int nNameCol = 0;
  125. static int nKCol    = 35;
  126. static int nDirCol  = 21;
  127. static int nAgeCol  = 35;  /* Note that this should be the RIGHT side of the age string! */
  128. static int nPlusCol = 36;
  129. static int nDescCol = 37;
  130.  
  131. /* default flags */
  132. int     screentype         = USE_CUSTOMSCREEN,    
  133.     getreadmes        = FALSE, 
  134.     filesflag          = TRUE,            /* get .lha files */
  135.     filelist_length     = 0,             /* no files loaded */
  136.          getlist_length        = 0,            /* no files selected either */
  137.     search_index        = 0,            /* buffer at first item */
  138.     mgetfind_findtype       = SEARCHTYPE_FORWARD,   /* global var used between mgetfind* */
  139.     simplepaths         = TRUE,            /* don't use ncftp style mgets */
  140.     searchcasesensitive     = FALSE,
  141.     sortcasesensitive       = FALSE,                    
  142.     maxoutputlinelength     = 254,             /* shell's limit */
  143.     requesttype             = FIND_REQUESTTYPE,     /* subwindow is for string searches */
  144.     nSortAlgorithm          = TREESORT,        /* default sort type */
  145.     appwindow         = TRUE,            /* = YES */
  146.  
  147.     omitcomments        = FALSE,        /* load comment lines */
  148.     screenisopen         = FALSE,        /* = NO */
  149.     windowisopen         = FALSE,         /* = NO */
  150.     noparse         = FALSE,        /* = yes, parse */
  151.     nocommand        = FALSE,        /* = yes, generate command */
  152.     nosplit         = FALSE,        /* = yes, split */
  153.     nocd            = FALSE,        /* = generate CD commands */
  154.     mgetNGad_height     = 248,            /* default first listview height */
  155.     keepblanklines        = FALSE;                /* = don't show blank lines */
  156.  
  157. ULONG kbytes_selected = 0;                                
  158.      
  159. UWORD     windowwidth     = MAXINT,    /* window will be sized to fill */
  160.     windowheight      = MAXINT,    /* screen unless these are */
  161.     windowtop     = 0,         /* overridden by parameters */
  162.     windowleft     = 0;
  163.         
  164. void *findvi = NULL;
  165.  
  166. struct Library *Intuitionbase    = NULL;
  167. struct GfxBase *GraphicsBase    = NULL;
  168. struct Library *GadToolsBase    = NULL;
  169. struct Library *UtilityBase    = NULL;
  170. struct Library *AslBase        = NULL;
  171. struct Library *IconBase    = NULL;
  172. struct Library *WorkbenchBase    = NULL;
  173.  
  174. struct IntuiMessage *message     = NULL;
  175. struct List *filelist         = NULL, 
  176.         *getlist         = NULL;
  177. struct Node *search_current     = NULL;
  178. struct Gadget *findgadlist     = NULL;
  179. struct TextFont *listfontdata     = NULL;
  180. struct DiskObject *appIconObj   = NULL;
  181.  
  182. __chip UWORD waitPointer[] =
  183.     {
  184.     0x0000, 0x0000,
  185.     0x0400, 0x07c0,
  186.     0x0000, 0x07c0,
  187.     0x0100, 0x0380,
  188.     0x0000, 0x07e0,
  189.     0x07c0, 0x1ff8,
  190.     0x1ff0, 0x3fec,
  191.     0x3ff8, 0x7fde,
  192.     0x3ff8, 0x7fbe,
  193.     0x7ffc, 0xff7f,
  194.     0x7efc, 0xffff,
  195.     0x7ffc, 0xffff,
  196.     0x3ff8, 0x7ffe,
  197.     0x3ff8, 0x7ffe,
  198.     0x1ff0, 0x3ffc,
  199.     0x07c0, 0x1ff8,
  200.     0x0000, 0x07e0,
  201.     0x0000, 0x0000};
  202.     
  203.  
  204. void debug(int a)
  205. {
  206.     fprintf(fpOut,"debug  %i\n",a);
  207.     Delay(80);
  208. }
  209.  
  210.  
  211.  
  212.  
  213. void EOLParse(char *sString)
  214. {
  215. char sTempString[50], sTemp2[2] = " "; 
  216. char * sCurrent = sString;
  217. int i=0, nStringLength;
  218.  
  219. if (sString == NULL) return;
  220. nStringLength = strlen(sString); 
  221. memset(sTempString,CHAR_NUL,sizeof(sTempString));
  222.  
  223. while ((i<(sizeof(sTempString)-1))&&(*sCurrent != CHAR_NUL))
  224. {
  225.     if (*sCurrent == '\\')
  226.     {
  227.         sCurrent++; i++;
  228.         switch(*sCurrent)
  229.         {
  230.             case 'r':
  231.                 strncat(sTempString,"\r",sizeof(sTempString));
  232.             break;
  233.             
  234.             case 'n':
  235.                 strncat(sTempString,"\n",sizeof(sTempString));
  236.             break;
  237.         
  238.             case CHAR_NUL:
  239.                 i = nStringLength + 1;    /* get out of the loop! */
  240.             break;
  241.             
  242.             case '\\':
  243.                 strncat(sTempString,"\\",sizeof(sTempString));
  244.             break;                
  245.             
  246.             default:
  247.                 sTemp2[0] = *sCurrent;
  248.                 strncat(sTempString,"\\",sizeof(sTempString));                
  249.                 strncat(sTempString,sTemp2,sizeof(sTempString));
  250.                 i++;
  251.             break;
  252.         }
  253.     }
  254.     else
  255.     {
  256.         sTemp2[0] = *sCurrent;
  257.         strncat(sTempString, sTemp2, sizeof(sTempString));
  258.         i++;
  259.     }
  260.     sCurrent++;
  261. }
  262. strncpy(sString,sTempString,nStringLength);
  263. return;
  264. }
  265.  
  266.  
  267.  
  268.  
  269.  
  270. /* If *index isn't NULL, that location will be set to the index
  271.    value of the tail of the list */
  272. struct Node * TailOf(struct List *thislist, int *index)
  273. {
  274.     struct Node *CurrentNode = thislist->lh_Head;
  275.     int nTempIndex = 0;
  276.     
  277.     /* traverse to tail of list */
  278.     while ((CurrentNode != NULL)&&(CurrentNode->ln_Succ != NULL))
  279.     {
  280.         nTempIndex++;
  281.         CurrentNode = CurrentNode->ln_Succ;
  282.     }
  283.  
  284.     if (index != NULL) *index = nTempIndex;
  285.  
  286.     return(CurrentNode);
  287. }
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294. /* Return index in list of the current 1st visible node */
  295. LONG ListViewTop (struct Gadget *gad, struct Window *win)
  296. {
  297.    LONG top;
  298.  
  299.     /* use Official attributes function if running under 3.0+, otherwise
  300.        hack into the Gadget struct to find out */
  301.    if (GadToolsBase->lib_Version >= 39)
  302.       GT_GetGadgetAttrs (gad, win, NULL, GTLV_Top, &top, TAG_END);
  303.    else
  304.       top = (LONG)(*(short *)(((char *)gad)+sizeof(struct Gadget)+4));
  305.  
  306.    return (top);
  307. }
  308.  
  309.  
  310.  
  311. /* return pointer to first visible node in thisGad, thislist */
  312. struct Node * ListViewTopNode(struct Gadget *thisGad, struct List *thislist)
  313. {
  314.     int nTemp = 0;
  315.     int nTop = ListViewTop(thisGad,mgetWnd);
  316.     struct Node *CurrentNode = NULL;
  317.  
  318.     CurrentNode = thislist->lh_Head;
  319.     while (nTemp < nTop) {CurrentNode = CurrentNode->ln_Succ; nTemp++;}
  320.     return(CurrentNode);
  321. }
  322.  
  323.  
  324.  
  325. int isAminetParsable(char *dataline)
  326. {
  327.     BOOL BValidLine;
  328.     
  329.     /* check to make sure string is a valid file line */
  330.     if ((dataline == NULL)||(dataline[0] == CHAR_NUL)||(dataline[Not[keepblanklines]] == CHAR_NUL)) return(FALSE);    
  331.         
  332.     if (!noparse)
  333.     {
  334.         if (((dataline[nNameCol] < '0')||(dataline[nNameCol] > 'z')) ||
  335.             ((dataline[nKCol] != 'K')&&(dataline[nKCol] != 'M')&&(dataline[nKCol] != '?')) || 
  336.             (dataline[nDirCol] < '0') || (dataline[nDirCol] > 'z') ||
  337.             (dataline[nDescCol] < 'A') || (dataline[nDescCol] > 'z') ||
  338.             ((dataline[nPlusCol] != '+')&&(dataline[nPlusCol] != '*')&&(dataline[nPlusCol] != ' ')) ||
  339.             ((filesflag == 0)&&(dataline[nPlusCol] != '+')))
  340.         {
  341.             /* Problem line--rescan! */
  342.             BValidLine = ReScanAminetLine(dataline);
  343.             if (filesflag == 0) return(BValidLine && (dataline[nPlusCol] == '+'));
  344.             else return(BValidLine);
  345.         }
  346.     }    
  347.     return(TRUE);
  348. }
  349.  
  350.  
  351. /* This function looks at an Aminet line and if successful, will update
  352.    the global n#?Col variables to reflect the columns found in this line
  353.    Returns 0 on failure (and won't update the global vars), or 1 on 
  354.    success (vars were all updated) */
  355. int ReScanAminetLine(char *dataline)
  356. {
  357.     BOOL BDone = FALSE, BFoundAgeAlready = FALSE;
  358.     int nCount = 0;
  359.     int nTempNameCol = -1;
  360.     int nTempKCol    = -1;
  361.     int nTempDirCol  = -1;
  362.     int nTempPlusCol = -1;
  363.     int nTempDescCol = -1;
  364.     int nTempAgeCol  = -1;
  365.     int nState = 0;     
  366.     
  367.     /* State 0 = haven't found filename yet */
  368.     /* State 1 = reading thru filename */
  369.     /* State 2 = haven't found directory yet */
  370.     /* State 3 = haven't found K/M thingy yet */
  371.     /* State 4 = haven't found weeks yet */
  372.     /* State 5 = Looking for plus symbol */
  373.     /* State 6 = Backtracking for age field */
  374.     
  375.     char *pcThisChar = dataline;
  376.     
  377.     if (pcThisChar == NULL) return(0);
  378.     
  379.     while((*pcThisChar != CHAR_NUL)&&(BDone == FALSE))
  380.     {
  381.         switch (nState)
  382.         {
  383.             case 0:        /* Looking for start of file name */
  384.                 if ((*pcThisChar >= '0')&&(*pcThisChar <= 'z'))
  385.                 {
  386.                     nTempNameCol = nCount;
  387.                     nState = 1;
  388.                 }
  389.                 pcThisChar++; 
  390.                 nCount++;
  391.                 break;
  392.             
  393.             case 1:        /* Reading thru filename */
  394.                 if (*pcThisChar == ' ')
  395.                 {
  396.                     nState = 2;
  397.                 }
  398.                 else
  399.                 {
  400.                     pcThisChar++; 
  401.                     nCount++;
  402.                 }
  403.                 break;
  404.             
  405.             case 2:    /* Moving over spaces after filename */
  406.                 if (*pcThisChar != ' ')
  407.                 {
  408.                     nTempDirCol = nCount;
  409.                     nState = 3;
  410.                 }
  411.                 pcThisChar++;
  412.                 nCount++;
  413.                 break;
  414.             
  415.             case 3:    /* Moving thru directory */
  416.                 if (*pcThisChar == ' ')
  417.                 {
  418.                     nState = 4;
  419.                 }
  420.                 pcThisChar++;
  421.                 nCount++;
  422.                 break;
  423.             
  424.             case 4: /* Looking for KCol */
  425.                 if ((*pcThisChar == 'K')||(*pcThisChar == 'M')||(*pcThisChar == '?'))
  426.                 {
  427.                     nTempKCol = nCount;
  428.                     nState = 5;
  429.                 }        
  430.                 pcThisChar++;
  431.                 nCount++;
  432.                 break;
  433.  
  434.             case 5: /* Looking for plus symbol, or the age number */
  435.                 if (*pcThisChar == '+')        
  436.                 {
  437.                     /* found the + */
  438.                     nTempPlusCol = nCount;
  439.                     nTempDescCol = nCount + 1;
  440.                     BDone = TRUE;
  441.                 }
  442.                 else if (((*pcThisChar >= '0')&&(*pcThisChar <= '9'))&&(BFoundAgeAlready != 2))
  443.                 {
  444.                     /* Found the age field, hopefully--this will keep being set until we find the last digit in the age */
  445.                     nTempAgeCol = nCount;
  446.                     BFoundAgeAlready = TRUE;
  447.                     
  448.                     pcThisChar++;
  449.                     nCount++;
  450.                 }
  451.                 else if (*pcThisChar != ' ')
  452.                 {
  453.                     /* Found the description, for sure */
  454.                     nTempPlusCol = nCount - 1;
  455.                     if (nTempPlusCol < 0) nTempPlusCol = 0;
  456.                     nTempDescCol = nCount;
  457.  
  458.                     pcThisChar -= 2;  /* move back to the left of the */
  459.                     nCount     -= 2;  /* first comment char AND the space */
  460.                     BDone = TRUE;    
  461.                 }
  462.                 else
  463.                 {    
  464.                     /* must be a space--continue onward */
  465.                     pcThisChar++;
  466.                     nCount++;
  467.                     
  468.                     /* If we were already doing the age, mark so as to not find another age! */
  469.                     if (BFoundAgeAlready == TRUE) BFoundAgeAlready = 2;    
  470.                 }
  471.                 break;
  472.         }
  473.     }
  474.     
  475.     /* Now we see if we've got something valid */
  476.     if (nState < 5) return(0);
  477.     
  478.     /* This in case there was no plus on this line! */
  479.     if (nTempPlusCol == -1) nTempPlusCol = nTempKCol + 1;
  480.     if (nTempDescCol == -1) nTempDescCol = (nTempPlusCol + (dataline[nTempPlusCol] != CHAR_NUL));
  481.     
  482.     /* Assign global vars */
  483.     nNameCol = nTempNameCol;
  484.     nDirCol  = nTempDirCol;
  485.     nKCol    = nTempKCol;
  486.     nPlusCol = nTempPlusCol;
  487.     nAgeCol  = nTempAgeCol;
  488.     nDescCol = nTempDescCol;
  489.     return(1);
  490. }
  491.     
  492.     
  493.     
  494.             
  495. int listviewgadgetClicked (VOID)
  496. {
  497. int i;
  498. struct Node *current = filelist->lh_Head;
  499. char *dataline = NULL;
  500.  
  501.  
  502.  for (i=0; i<lastcode; i++) current = current->ln_Succ;
  503.  
  504.  if (current != NULL)
  505.  {
  506.     /* Take it out of filelist */
  507.     AttachLists(FALSE);
  508.     TransferToSelected(current);
  509.     AttachLists(TRUE);
  510.  }
  511.  return(1);    
  512. }
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520. int list2Clicked (VOID)
  521. {
  522.  /* This function will move a clicked item from the lower list to the upper one */
  523.  int i;
  524.  struct Node *current = getlist->lh_Head;
  525.  
  526.  for (i=0; i<lastcode; i++) current = current->ln_Succ;
  527.     
  528.  if (current != NULL)
  529.  {
  530.     AttachLists(FALSE);
  531.     TransferToFiles(current);
  532.     AttachLists(TRUE);
  533.  }
  534. }
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541. void TransferToSelected(struct Node *current)
  542. {
  543.  
  544.     if (isAminetParsable(current->ln_Name) == FALSE) return;  /* don't transfer what you cant understand */
  545.  
  546.     UpdateByteCount(current->ln_Name,1);
  547.     
  548.     /* Watch out for the nasty case where our search buffer just got removed */
  549.     if (search_current == current) 
  550.     {
  551.         if (search_current != filelist->lh_Head)    /* make sure we're not the first in the list */
  552.         {
  553.             search_current = search_current->ln_Pred;
  554.             search_index--;
  555.         }
  556.         else
  557.         {
  558.             search_current = search_current->ln_Succ;
  559.             search_index++;
  560.         }
  561.         
  562.         /* Check to see if we've walked off the front or back of the list */
  563.         /* If we have, default to the head of the list */
  564.         if (search_current == NULL) 
  565.         {
  566.             
  567.                 search_current = filelist->lh_Head;
  568.                 search_index = 0;
  569.         }
  570.     }
  571.  
  572.     Remove(current);
  573.     /* And insert it in getlist */
  574.     if ((nKeepSorted[1] == 1)&&(!noparse))
  575.     {
  576.         SmartAdd(getlist,current,nSortType[1]);
  577.     }
  578.     else
  579.     {
  580.         AddTail(getlist,current);
  581.     }
  582.     
  583.     filelist_length--;
  584.     getlist_length++;
  585.     
  586.     ChangeWindowTitle();
  587. }
  588.  
  589.  
  590.  
  591.  
  592. void TransferToFiles(struct Node *current)
  593. {
  594.     UpdateByteCount(current->ln_Name,-1);
  595.  
  596.     /* Take it out of getlist */
  597.     Remove(current);
  598.     current->ln_Succ = NULL;        /* Clear now invalid field */
  599.  
  600.     /* And insert it in filelist */
  601.      if ((nKeepSorted[0] == 1)&&(!noparse))
  602.      {    
  603.          SmartAdd(filelist,current,nSortType[0]);
  604.      }
  605.     else
  606.     {
  607.         AddTail(filelist,current);
  608.     }
  609.     
  610.     /* and that's it! */
  611.     filelist_length++;
  612.     getlist_length--;
  613.  
  614.     ChangeWindowTitle();
  615. }
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624. /* Returns file size, in weeks, of the given Aminet line--only
  625.    works if said file size is available, of course */
  626. int AminetFileAge(char *sString)
  627. {
  628.     int nTemp;
  629.     int nSum = 0;
  630.  
  631.     if (isAminetParsable(sString) == FALSE) return(0);
  632.  
  633.     /* New:  Assume that nAgeCol is the rightmost numeral of the number! */
  634.     nTemp = nAgeCol;
  635.     
  636.     if (nTemp < 0) return(-999);    /* there is no age! */
  637.     
  638.     /* no number? */
  639.     if ((sString[nTemp] < '0')||(sString[nTemp] > '9')) return(-999);
  640.  
  641.     /* go to front of string */
  642.     while ((nTemp > 0)&&(sString[nTemp] >= '0')&&(sString[nTemp] <= '9')) nTemp--;
  643.     nTemp++;
  644.     
  645.     while ((sString[nTemp] >= '0')&&(sString[nTemp] <= '9'))
  646.     {
  647.         nSum *= 10;
  648.         nSum += sString[nTemp] - '0';
  649.         nTemp++;
  650.     }
  651.     return(nSum);
  652. }
  653.  
  654.  
  655.  
  656. int AminetFileSize(char *sString)
  657. {
  658. /* Returns file size, in kilobytes, of the given Aminet line */
  659. int multiplier;
  660. int filesize = 0, wholenum;
  661. int outputlength = -1;
  662. int tenthofmultiplier = 0;
  663.  
  664.     if (isAminetParsable(sString) == FALSE) return(0);
  665.     
  666.     switch (sString[nKCol])
  667.     {
  668.         case 'M':
  669.             multiplier = 1024;   /* 1024 k in a M */
  670.             tenthofmultiplier = 102;
  671.             break;
  672.             
  673.         case 'K': 
  674.             multiplier = 1;     /* 1 k in a k */
  675.             break;
  676.         
  677.         case '?':
  678.             multiplier = 0;
  679.             break;
  680.             
  681.         default:
  682.             return(FALSE);
  683.     }
  684.     
  685.     if (sString[nKCol-2] == '.')        /* for when it's like:  3.5M */
  686.     {
  687.         /* figure out kilobytes */
  688.         wholenum = (int) (sString[nKCol-3] - '0');
  689.         
  690.         if ((wholenum >= 0)&&(wholenum <= 9)) filesize = filesize + (multiplier * wholenum);
  691.         
  692.         wholenum = (int) (sString[nKCol-1] - '0');
  693.         if ((wholenum >= 0)&&(wholenum <= 9)) filesize = filesize + (tenthofmultiplier * wholenum);
  694.     }
  695.     else
  696.     {
  697.         wholenum = (int) (sString[nKCol-3] - '0');
  698.         if ((wholenum >= 0)&&(wholenum <= 9)) filesize = filesize + (100 * multiplier * wholenum);
  699.  
  700.         wholenum = (int) (sString[nKCol-2] - '0');
  701.         if ((wholenum >= 0)&&(wholenum <= 9)) filesize = filesize + ( 10 * multiplier * wholenum);
  702.  
  703.         wholenum = (int) (sString[nKCol-1] - '0');
  704.         if ((wholenum >= 0)&&(wholenum <= 9)) filesize = filesize + (      multiplier * wholenum);
  705.     }
  706.     
  707.     return(filesize);
  708. }
  709.  
  710.  
  711.  
  712. void SmartAdd(struct List *thislist, struct Node *addme, int nThisSortType)
  713. {
  714. /* a simple add into the correct order of the list */
  715. struct Node *current, *past;
  716. char sBuffer1[43], sBuffer2[43];
  717.  
  718. current = thislist->lh_Head;
  719. past = NULL;
  720.  
  721. if ((addme == NULL)||(addme->ln_Name == NULL)) return();
  722.  
  723. while (current != NULL)            
  724. {
  725.     /* Only sort if this is an Aminet file line, or not an Aminet Sort */    
  726.     if ((current->ln_Name != NULL)&&(isAminetParsable(current->ln_Name)&&isAminetParsable(addme->ln_Name)))
  727.     {
  728.         switch(nThisSortType)
  729.         {
  730.             case SORTBYDIR:
  731.                 strncpy(sBuffer1,addme->ln_Name+nDirCol,DIRNAMESIZE);
  732.                 strncpy(sBuffer2,current->ln_Name+nDirCol,DIRNAMESIZE);
  733.                 if ((strchr(sBuffer1,'/') != NULL)&&
  734.                      (strchr(sBuffer2,'/') != NULL)&&
  735.                       (strncmp(sBuffer1,sBuffer2,DIRNAMESIZE) < 0))
  736.                 {
  737.                     Insert(thislist, addme, past);    /* and put it back in after current */
  738.                     return();
  739.                 }
  740.             break;
  741.         
  742.             case SORTBYDESC:
  743.                 if (strncmp(addme->ln_Name+nDescCol,current->ln_Name+nDescCol,DESCSIZE) < 0)
  744.                 {
  745.                     Insert(thislist, addme, past);    /* and put it back in after current */
  746.                     return();
  747.                 }
  748.             break;
  749.             
  750.             case SORTBYNAME:
  751.                 memset(sBuffer1,NUL,NAMESIZE);  /* sort sometimes goes into infinite loops if you don't have this??? */
  752.                 memset(sBuffer2,NUL,NAMESIZE);  /* It shouldn't, though, because strncpy terminates everything right? */
  753.                 strncpy(sBuffer1,addme->ln_Name+nNameCol,NAMESIZE);
  754.                 strncpy(sBuffer2,current->ln_Name+nNameCol,NAMESIZE);    
  755.                 if (strncmp(sBuffer1,sBuffer2,NAMESIZE) < 0)
  756.                 {
  757.                     Insert(thislist, addme, past);    /* and put it back in after current */        
  758.                     return();
  759.                 }
  760.             break;
  761.             
  762.             case SORTBYSIZE:
  763.                 if (AminetFileSize(addme->ln_Name) < AminetFileSize(current->ln_Name))
  764.                 {
  765.                     Insert(thislist, addme, past);    /* and put it back in after current */
  766.                     return();
  767.                 }
  768.                 
  769.             case SORTBYAGE:
  770.                 if (AminetFileAge(addme->ln_Name) < AminetFileAge(current->ln_Name))
  771.                 {
  772.                     Insert(thislist, addme, past);    /* and put it back in after current */
  773.                     return();
  774.                 }
  775.                 break;
  776.             }
  777.     }    
  778.     past = current;                /* step to next in list */
  779.     current = current->ln_Succ;
  780. }
  781.     
  782. AddTail(thislist,addme);        /* If we've got to the end without returning, add it to the end */
  783. return();
  784. }
  785.  
  786.  
  787.  
  788.  
  789.  
  790. int CompareByDir(struct Node *past, struct Node *current)
  791. {
  792.     static char sBuffer1[43], sBuffer2[43];  /* static to avoid re- and de-allocing */
  793.     
  794.     if (isAminetParsable(current->ln_Name) == FALSE) return(-999);     /* error! */
  795.          
  796.     if (sortcasesensitive == TRUE) 
  797.         return(strncmp(past->ln_Name+nDirCol,current->ln_Name+nDirCol,DIRNAMESIZE));  /* For Lists, > 0 = switch */
  798.  
  799.     /* case insensitive */    
  800.     strncpy(sBuffer1,past->ln_Name+nDirCol,DIRNAMESIZE);
  801.     strncpy(sBuffer2,current->ln_Name+nDirCol,DIRNAMESIZE);
  802.     UpperCase(sBuffer1);        /* not case sensitive */
  803.     UpperCase(sBuffer2);
  804.     
  805.     return(strncmp(sBuffer1,sBuffer2,DIRNAMESIZE));  /* For Lists, > 0 = switch */
  806. }
  807.  
  808.  
  809.  
  810.     
  811. int CompareByDesc(struct Node *past, struct Node *current)
  812. {
  813.     static char sBuffer1[43], sBuffer2[43];  /* static to avoid re- and de-allocing */
  814.  
  815.     /* Make sure the comment is ok! */
  816.     if (isAminetParsable(current->ln_Name) == FALSE) return(-999);     /* error! */
  817.     
  818.     if (sortcasesensitive == TRUE) return(strncmp(past->ln_Name+nDescCol,current->ln_Name+nDescCol,DESCSIZE));
  819.  
  820.     /* For Lists, > 0 = switch */
  821.     strncpy(sBuffer1,past->ln_Name+nDescCol,DESCSIZE);        /* copies to modify */
  822.     strncpy(sBuffer2,current->ln_Name+nDescCol,DESCSIZE);    
  823.     UpperCase(sBuffer1);        /* not case sensitive */
  824.     UpperCase(sBuffer2);
  825.     
  826.    return(strncmp(sBuffer1, sBuffer2,DESCSIZE));
  827.     
  828.  
  829.  
  830.     
  831.  
  832.  
  833. int CompareByName(struct Node *past, struct Node *current)
  834. {
  835.     static char sBuffer1[43], sBuffer2[43];  /* static to avoid re- and de-allocing */
  836.  
  837.     /* Make sure the comment is ok! */
  838.     if (isAminetParsable(current->ln_Name) == FALSE) return(-999);     /* error! */
  839.  
  840.     if (sortcasesensitive == TRUE) return(strncmp(past->ln_Name+nNameCol,current->ln_Name+nNameCol,NAMESIZE));
  841.     
  842.     /* case insensitive test below */    
  843.     strncpy(sBuffer1,past->ln_Name+nNameCol,NAMESIZE);
  844.     strncpy(sBuffer2,current->ln_Name+nNameCol,NAMESIZE);    
  845.     UpperCase(sBuffer1);
  846.     UpperCase(sBuffer2);
  847.     
  848.     return(strncmp(sBuffer1,sBuffer2,NAMESIZE));
  849. }
  850.  
  851.  
  852.  
  853.  
  854.  
  855. int CompareBySize(struct Node *past, struct Node *current) 
  856. {
  857.     return(AminetFileSize(past->ln_Name) - AminetFileSize(current->ln_Name));
  858. }
  859.  
  860.  
  861. int CompareByAge(struct Node *past, struct Node *current) 
  862. {
  863.     return(AminetFileAge(past->ln_Name) - AminetFileAge(current->ln_Name));
  864. }
  865.  
  866.  
  867. void SortList(struct List *thislist, int nThisSortType)
  868. {
  869.     static char sSortTypeString[40];
  870.     char *sSortWinString;
  871.     
  872.     SetMenuValues();
  873.  
  874.     pcWhatToAbort = "Sort";
  875.         
  876.     strcpy(sSortTypeString, "Sorting by \0");
  877.     
  878.     if (windowisopen) SetWindowTitles(mgetWnd, "Sorting--please be patient", (char *) ~0); 
  879.  
  880.     /* Generate Window title prompt */
  881.     switch(nThisSortType)
  882.     {
  883.         case SORTBYDIR:  strcat(sSortTypeString,"Directory: ");   break;
  884.         case SORTBYSIZE: strcat(sSortTypeString,"Size: ");      break;
  885.         case SORTBYDESC: strcat(sSortTypeString,"Description: "); break;
  886.         case SORTBYNAME: strcat(sSortTypeString,"FileName: ");    break;
  887.         case SORTBYAGE:  strcat(sSortTypeString,"Age: ");         break;
  888.         default:     strcat(sSortTypeString,"Unknown: ");      break;
  889.     }
  890.  
  891.     sSortWinString = strrchr(sSortTypeString,' ') + 1;        /* Where to write next */
  892.     sTreeWriteHere = sSortWinString;
  893.     szTickerString = sSortTypeString;
  894.             
  895.     if (thislist == NULL) return;
  896.     
  897.     /* Remove list from ListView if necessary  */
  898.      if (windowisopen)
  899.      {
  900.         AttachLists(FALSE);
  901.         SetWaitPointer(mgetWnd);
  902.     }
  903.  
  904.     switch (nSortAlgorithm)
  905.     {
  906.          case BUBBLESORT: BubbleSortList(thislist, nThisSortType, sSortWinString, sSortTypeString); break;
  907.          case TREESORT:   TreeSortList  (thislist, nThisSortType, sSortWinString, sSortTypeString); break;
  908.      }
  909.      
  910.     /* Replace list into ListView */
  911.     AttachLists(TRUE);
  912.     ClearWaitPointer(mgetWnd);
  913.     
  914.     ChangeWindowTitle();
  915.     SetMenuValues();
  916. }
  917.  
  918.  
  919.  
  920.  
  921.  
  922. int TreeSortUserCompare(struct Node *thisnode, struct Node *thatnode)
  923. {
  924.     int nResult;
  925.  
  926.     switch(nForTreeSortUseOnly)  /* using a global variable here stinks :( */
  927.     {
  928.         case SORTBYDIR:  nResult = CompareByDir (thisnode, thatnode); break;
  929.         case SORTBYNAME: nResult = CompareByName(thisnode, thatnode); break;
  930.         case SORTBYSIZE: nResult = CompareBySize(thisnode, thatnode); break;
  931.         case SORTBYDESC: nResult = CompareByDesc(thisnode, thatnode); break;
  932.         case SORTBYAGE:  nResult = CompareByAge (thisnode, thatnode); break;
  933.     }
  934.     if (nResult == 0) return(1);  /* default value can't be zero! */
  935.     return(nResult);
  936. }
  937.  
  938.  
  939.  
  940.  
  941. void TreeSortList(struct List *thislist, int nThisSortType, char *sSortWinString, char *sSortTypeString)    
  942. {
  943.     struct Node *CurrentNode = thislist->lh_Head;
  944.     tree *mytree = NULL;                                    
  945.  
  946.     /* make tree out of our list */
  947.     tree_init(&mytree);
  948.  
  949.     /* set global variables for TreeSortUserCompare and TransferNode's use */    
  950.     nForTreeSortUseOnly = nThisSortType;   /* Used by TreeSortUserCompare  */
  951.     lForTreeSortUseOnly = thislist;          /* Used by TransferNode         */
  952.     
  953.     lTreeTicker = 0;
  954.     lTreeSubTicker = 0;
  955.     
  956.     while (CurrentNode != NULL)
  957.     {        
  958.         if ((CurrentNode->ln_Succ != NULL) &&    /* <--This is necessary to avoid the "killer node" ??? */
  959.             (CurrentNode->ln_Name != NULL) &&
  960.             (*CurrentNode->ln_Name != cCommentChar))
  961.             tree_add(&mytree, TreeSortUserCompare, (char *) CurrentNode, DeleteNodeError);
  962.     
  963.         CurrentNode = CurrentNode->ln_Succ;        /* move down the list */
  964.         
  965.         if (CheckForUserAbort() == TRUE) CurrentNode = NULL;    /* kick out on abort */        
  966.     }
  967.     
  968.     /* traverse tree, inserting into new list */
  969.     /* nAbort now stays true only if both of the below are true */
  970.     if (tree_trav(&mytree,TransferNode) == FALSE)
  971.         MakeReq("Tree Sort Error","Warning:  Tree Sort failed; list may be incomplete", NULL);
  972.     
  973.     /* now clean up the tree -- since Nodes are still in a List, we don't want to delete them */
  974.      tree_mung(&mytree, DoNothing);
  975. }    
  976.  
  977.  
  978.  
  979. int CheckForUserAbort(void)
  980. {
  981.     static int nReturn;
  982.     static char szPrompt[20]="";
  983.     static struct IntuiMessage *imsg;
  984.     
  985.     if (mgetWnd == NULL) return(FALSE);
  986.     
  987.     while (imsg = GT_GetIMsg(mgetWnd->UserPort)) 
  988.     {
  989.         switch (imsg->Class)
  990.         {
  991.             case IDCMP_VANILLAKEY: case IDCMP_CLOSEWINDOW:
  992.                 if ((imsg->Code == CHAR_ESCAPE)||(imsg->Class == IDCMP_CLOSEWINDOW))
  993.                 {
  994.                     GT_ReplyIMsg(imsg);
  995.                     sprintf(szPrompt,"Abort the %s?",pcWhatToAbort);
  996.                     nReturn = (MakeReq(szPrompt,"GadMget Abort Request","Continue|Abort") == 0);
  997.                     if (mgetWnd != NULL) SetWaitPointer(mgetWnd);
  998.                     return(nReturn);
  999.                 }
  1000.                 else GT_ReplyIMsg(imsg);
  1001.                 break;
  1002.                 
  1003.              case IDCMP_NEWSIZE: case IDCMP_REFRESHWINDOW:
  1004.                 HandlemgetIDCMP(imsg);    /* do window resize */
  1005.                  break;
  1006.  
  1007.             case IDCMP_MENUPICK:
  1008.                 SetMenuValues();    /* undo the damage */
  1009.                 GT_ReplyIMsg(imsg);
  1010.                 break;
  1011.                                      
  1012.              default:
  1013.                  GT_ReplyIMsg(imsg);
  1014.                  break;
  1015.         }
  1016.     }
  1017.     return(FALSE);
  1018. }
  1019.  
  1020.  
  1021. int DoNothing (struct Node *thisnode)
  1022. {
  1023.    /* and here is the magic code to .... do nothing! */
  1024.    return(0);
  1025. }
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031. int TransferNode(struct Node *thisnode)
  1032. {    
  1033.     if (isAminetParsable(thisnode->ln_Name))
  1034.     {
  1035.         Remove(thisnode); 
  1036.         AddTail((struct List *) lForTreeSortUseOnly, thisnode); 
  1037.     }
  1038.     return(TRUE);
  1039. }
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046. int PrintNodeData(struct Node *thisnode)
  1047. {
  1048.  
  1049.     if (thisnode == NULL) return(FALSE);
  1050.     if (thisnode->ln_Name == NULL) return(FALSE);
  1051.     
  1052.     printf("[%s]\n",thisnode->ln_Name);
  1053.     return(TRUE);
  1054. }
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061. int DeleteNodeError(struct Node *thisnode)
  1062. {
  1063.     printf("tree_add tried to delete this node:\n");
  1064.     PrintNodeData(thisnode);
  1065. }
  1066.  
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072. void BubbleSortList(struct List *thislist, int nThisSortType, char *sSortWinString, char *sSortTypeString)
  1073. {
  1074.    /* a simple swap-sort */
  1075.     int nSwappedThisPass = 1, nUpdateTitle = 0, nUpdateCount = 0;
  1076.     struct Node *current, *past;
  1077.  
  1078.     while (nSwappedThisPass > 0)
  1079.     {
  1080.         /* start a pass */
  1081.         past = thislist->lh_Head;
  1082.         if (past == NULL) return;
  1083.         
  1084.         current = past->ln_Succ;
  1085.         nSwappedThisPass = 0;        /* start with none recorded */
  1086.  
  1087.         while (current != NULL)            
  1088.         {
  1089.             /* Only sort if this is an Aminet file line, or not an Aminet Sort */    
  1090.             if ((current->ln_Name != NULL)&&(past->ln_Name != NULL)&&
  1091.                 (isAminetParsable(current->ln_Name)&&isAminetParsable(past->ln_Name)))
  1092.             {
  1093.                 if ((past->ln_Name != NULL)&&(*past->ln_Name != cCommentChar))
  1094.                 {
  1095.                     if ((nThisSortType == SORTBYDIR) &&(CompareByDir (past,current) > 0) ||
  1096.                         (nThisSortType == SORTBYSIZE)&&(CompareBySize(past,current) > 0) ||
  1097.                         (nThisSortType == SORTBYDESC)&&(CompareByDesc(past,current) > 0) ||
  1098.                         (nThisSortType == SORTBYNAME)&&(CompareByName(past,current) > 0))
  1099.                     {
  1100.                     /* Swap the two nodes */
  1101.                      Remove(past);
  1102.                      Insert(thislist, past, current);
  1103.                      nSwappedThisPass++;
  1104.                     }
  1105.                 }
  1106.             }    
  1107.             past = current;
  1108.             current = current->ln_Succ;
  1109.         }
  1110.         
  1111.         if (windowisopen)
  1112.         {
  1113.             sprintf(sSortWinString,"%i",nUpdateCount);
  1114.             SetWindowTitles(mgetWnd, sSortTypeString, (char *) ~0);
  1115.             nUpdateCount++; 
  1116.          }              
  1117.  
  1118.         if (CheckForUserAbort() == TRUE) nSwappedThisPass = 0;    /* kick out on abort */        
  1119.     }        
  1120.     return;
  1121. }
  1122.         
  1123.  
  1124. /* Returns the length of the first "word" in the string, i.e. number
  1125.    of letters before the space */        
  1126. int LengthOfWord(char *szString)
  1127. {
  1128.     char *pcTemp = szString;
  1129.     int nCount = 0;
  1130.  
  1131.     /* skip any leading spaces */
  1132.     while (*pcTemp == ' ') pcTemp++;
  1133.     
  1134.     /* Count chars in word */    
  1135.     while ((*pcTemp != CHAR_NUL)&&(*pcTemp != ' ')) 
  1136.     {
  1137.         nCount++;
  1138.         pcTemp++;
  1139.     }
  1140.     
  1141.     return(nCount);
  1142. }
  1143.  
  1144.  
  1145.  
  1146.  
  1147. int OutputList(struct List *thislist)
  1148. {
  1149.  #define LASTDIRBUFSIZE 30
  1150.  
  1151.  char *p;
  1152.  int k,l,z,next_bytes,putnameOK = 0,putcommandOK = 1; 
  1153.  int printed_bytes = maxoutputlinelength - 1, printreturnfirst = 0;
  1154.  char outname[MAXFILELINELENGTH],szLastDir[LASTDIRBUFSIZE];
  1155.  struct Node *current;
  1156.  
  1157.  memset(szLastDir,NUL,LASTDIRBUFSIZE);
  1158.  
  1159.  /* Get any readme files first, so user can browse them while d/l'ing the rest */
  1160.  if (getreadmes)
  1161.     {
  1162.     current = thislist->lh_Head;
  1163.      while (current != NULL)
  1164.      {
  1165.          /* watch out for empty nodes! */
  1166.         if (isAminetParsable(current->ln_Name))
  1167.         {
  1168.             z = strlen(current->ln_Name);
  1169.             /* Extra filtering code, borrowed from mgetlistviewclicked()... */
  1170.             if ((current->ln_Name[nNameCol] < '0')||(current->ln_Name [nNameCol] > 'z')) z = 0;
  1171.             if (current->ln_Name[nDirCol] < '0') z = 0;
  1172.             if ((filesflag == 0)&&(current->ln_Name[nPlusCol] != '+')) z = 0;
  1173.             /* end code from mgetlistviewclicked() ... */
  1174.         }
  1175.         else z=0;
  1176.         
  1177.         if (z>nDirCol)
  1178.         {
  1179.             k = LengthOfWord(¤t->ln_Name[nNameCol]);    /* length of filename */
  1180.             l = LengthOfWord(¤t->ln_Name[nDirCol]);   /* length of directory */
  1181.     
  1182.             if ((k<(nDirCol+1))&&(k>0)&&(l<12)&&(l>2))
  1183.             {
  1184.                 memset(outname,NUL,MAXFILELINELENGTH);
  1185.                 strncat(outname,¤t->ln_Name[nDirCol],l);
  1186.                 
  1187.                 /* Here we have the directory name--see if it's different, generate cd */
  1188.                 if ((current->ln_Name[nPlusCol] == '+')&&
  1189.                     (nocd == 0)&&
  1190.                     (simplepaths == 1)&&
  1191.                     (strncmp(szLastDir,outname,LASTDIRBUFSIZE) != 0)) 
  1192.                 {
  1193.                     memset(szLastDir,NUL,LASTDIRBUFSIZE);
  1194.                     GenerateCDCommand(&printreturnfirst, &printed_bytes, szLastDir, outname);
  1195.                     putnameOK = 1;
  1196.                     putcommandOK = 0;
  1197.                 }
  1198.                 
  1199.                 if (simplepaths == 1)
  1200.                 {    
  1201.                     /* remove path so it won't be printed again in the mget command */
  1202.                     memset(outname,NUL,sizeof(outname));
  1203.                 }
  1204.                 else
  1205.                 {
  1206.                     strncat(outname,"/",1);
  1207.                 }
  1208.                 
  1209.                 strncat(outname,¤t->ln_Name[nNameCol],k);
  1210.                 outname[79]=0;    /* just in case, we'll reterminate the string */            
  1211.             
  1212.                 if (current->ln_Name[nPlusCol] == '+')
  1213.                     {    
  1214.                     /* find the last '.' in outname, and change whatever's after it to 'readme'! */
  1215.                     p = strrchr(outname,'.');
  1216.                     
  1217.                     /* and if there is no "." ? */
  1218.                     if (p == NULL)
  1219.                     {
  1220.                         strcat(outname,".");
  1221.                         p = strrchr(outname,'.');
  1222.                     }
  1223.                     
  1224.                     strcpy(p+1,"readme");
  1225.                     
  1226.                     next_bytes = strlen(outname) + 1;    /* + 1 for the space */
  1227.                     if ((next_bytes>3)&&(next_bytes<39))
  1228.                         {
  1229.                         if ((putcommandOK == 1)&&(!nosplit)&&((printed_bytes + next_bytes) > maxoutputlinelength))
  1230.                             {
  1231.                             PrintCommandString(&printreturnfirst, &printed_bytes);            
  1232.                             putnameOK = 1;
  1233.                             }            
  1234.                         fprintf(fpOut,"%s ",outname);
  1235.                         printed_bytes = printed_bytes + next_bytes;
  1236.                         putcommandOK = 1;
  1237.                         }
  1238.                     }
  1239.                 }
  1240.             }
  1241.         current = current->ln_Succ;    
  1242.         }
  1243.     }        
  1244.  
  1245.  if (filesflag)
  1246.  {    
  1247.      current = thislist->lh_Head;    
  1248.     while (current != NULL)
  1249.     {
  1250.          /* watch out for empty nodes! */
  1251.         if (isAminetParsable(current->ln_Name))
  1252.         {
  1253.             z = strlen(current->ln_Name);
  1254.             /* Extra filtering code, borrowed from mgetlistviewclicked()... */
  1255.             if ((current->ln_Name[nNameCol] < '0')||(current->ln_Name [nNameCol] > 'z')) z = 0;
  1256.             if ((filesflag == 0)&&(current->ln_Name[nPlusCol] != '+')) z = 0;
  1257.             /* end code from mgetlistviewclicked() ... */
  1258.         }
  1259.         else z=0;
  1260.  
  1261.         if (z>nDirCol)
  1262.         {
  1263.             k = LengthOfWord(¤t->ln_Name[nNameCol]);    /* length of filename */
  1264.             l = LengthOfWord(¤t->ln_Name[nDirCol]);   /* length of directory */
  1265.  
  1266.             if ((k<(nDirCol+1))&&(k>0)&&(l<12)&&(l>2))
  1267.             {
  1268.                 memset(outname,NUL,MAXFILELINELENGTH);
  1269.                 strncat(outname,¤t->ln_Name[nDirCol],l);
  1270.  
  1271.                 /* Here we have the directory name--see if it's different, generate cd */
  1272.                 if ((nocd == 0)&&
  1273.                     (simplepaths == 1)&&
  1274.                     (strncmp(szLastDir,outname,LASTDIRBUFSIZE) != 0)) 
  1275.                 {
  1276.                     memset(szLastDir,NUL,LASTDIRBUFSIZE);
  1277.                     GenerateCDCommand(&printreturnfirst, &printed_bytes, szLastDir, outname);
  1278.                     putcommandOK = 0;
  1279.                     putnameOK = 1;
  1280.                 }
  1281.                 
  1282.                 if (simplepaths == 1)
  1283.                 {    
  1284.                     /* remove path so it won't be printed again in the mget command */
  1285.                     memset(outname,NUL,sizeof(outname));
  1286.                 }
  1287.                 else
  1288.                 {
  1289.                     strncat(outname,"/",1);
  1290.                 }
  1291.                 
  1292.                 
  1293.                 strncat(outname,¤t->ln_Name[nNameCol],k);
  1294.                 outname[79]=0;    /* just in case, we'll reterminate the string */            
  1295.                 if (filesflag)
  1296.                 {    
  1297.                     next_bytes = strlen(outname) + 1;    /* + 1 for the space */
  1298.                     if ((next_bytes>3)&&(next_bytes<33))
  1299.                     {
  1300.                         if ((putcommandOK == 1)&&(!nosplit)&&((printed_bytes + next_bytes) > maxoutputlinelength))
  1301.                         {
  1302.                             PrintCommandString(&printreturnfirst, &printed_bytes);    
  1303.                             putnameOK = 1;
  1304.                         }            
  1305.                         fprintf(fpOut,"%s ",outname);
  1306.                         putcommandOK = 1;
  1307.                         printed_bytes = printed_bytes + next_bytes;
  1308.                     }
  1309.                 }
  1310.             }
  1311.         }    
  1312.     current = current->ln_Succ;    
  1313.     }
  1314.  }
  1315. return(1);
  1316. }
  1317.  
  1318.  
  1319.  
  1320.  
  1321. void PrintCommandString(int *printreturnfirst, int *printed_bytes)
  1322. {
  1323.     if (*printreturnfirst) fprintf(fpOut,sEndOfLineString); 
  1324.     *printreturnfirst = 1;
  1325.         
  1326.     if (nocommand) 
  1327.     {
  1328.         *printed_bytes = 0;
  1329.     }
  1330.     else
  1331.     {
  1332.         fprintf(fpOut,"%s",szCommandString);
  1333.         *printreturnfirst = 1;
  1334.         *printed_bytes = strlen(szCommandString) + 1;    /* reset counter for next batch */
  1335.     }
  1336.     return;
  1337. }
  1338.  
  1339.  
  1340.  
  1341.  
  1342. void GenerateCDCommand(int *printreturnfirst, int *printed_bytes, char *szLastDir, char *outname)
  1343. {
  1344.     if (*printreturnfirst) fprintf(fpOut,sEndOfLineString);
  1345.     fprintf(fpOut,"cd ");
  1346.                 
  1347.     /* On the first item, we will be starting at the aminet root
  1348.        directory, so we won't need to print the ../.. .  After that,
  1349.         though, we will.  printreturnfirst serves nicely to tell
  1350.         whether or not we're in the first iteration. */   
  1351.     
  1352.     if (*printreturnfirst == 1) fprintf(fpOut,sAminetPathString);
  1353.             
  1354.     fprintf(fpOut,"%s",outname);
  1355.     *printreturnfirst = 1;
  1356.     PrintCommandString(printreturnfirst, printed_bytes);
  1357.  
  1358.     /* update buffer */    
  1359.     strncpy(szLastDir,outname,30);    
  1360.  
  1361.     return;
  1362. }            
  1363.  
  1364.  
  1365.  
  1366. int RawOutputList(struct List *thislist)
  1367. {
  1368.  struct Node *current = thislist->lh_Head;
  1369.  int minlinelength = 1;
  1370.  
  1371.  if (keepblanklines == 1) minlinelength = 0;
  1372.  
  1373.  if (mgetWnd != NULL) SetWaitPointer(mgetWnd);
  1374.  
  1375.       
  1376.  while (current != NULL)
  1377.  {    
  1378.     if ((current->ln_Name != NULL)&&(current->ln_Name[0] < 128)&&(strlen(current->ln_Name) >= minlinelength))
  1379.     {
  1380.         if (current->ln_Name[0] < minlinelength)     /* was 14? */
  1381.             fprintf(fpOut,"\n",current->ln_Name);
  1382.         else    fprintf(fpOut,"%.300s\n",current->ln_Name);
  1383.     }
  1384.     current = current->ln_Succ;
  1385.  }
  1386.  
  1387.  ClearWaitPointer(mgetWnd);
  1388.  
  1389.  return(1);
  1390. }
  1391.  
  1392.  
  1393.  
  1394.  
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400. int MakeReq(char *sText, char *sTitle, char *sGadgets)
  1401. {
  1402.     struct EasyStruct myreq;
  1403.     LONG number = 0L;
  1404.     int nResult;
  1405.     
  1406.     if (sTitle == NULL) sTitle = "GadMGet Error";
  1407.     if (sText == NULL) sText = "A nasty error happened!";
  1408.     if (sGadgets == NULL) sGadgets = "OK";
  1409.     
  1410.     myreq.es_TextFormat   = sText;
  1411.     myreq.es_Title        = sTitle;
  1412.     myreq.es_GadgetFormat = sGadgets;
  1413.     
  1414.     SetWaitPointer(mgetWnd);
  1415.     nResult = EasyRequest(mgetWnd, &myreq, NULL, NULL, number);
  1416.     ClearWaitPointer(mgetWnd);
  1417.     return(nResult);
  1418. }
  1419.  
  1420.  
  1421. int mgettreesort (VOID)
  1422. {
  1423.     nSortAlgorithm = TREESORT;
  1424.     SetMenuValues();
  1425. }
  1426.  
  1427. int mgetbubblesort (VOID)
  1428. {
  1429.     nSortAlgorithm = BUBBLESORT;
  1430.     SetMenuValues();
  1431. }    
  1432.  
  1433. int mgetsortcase (VOID)
  1434. {
  1435.     sortcasesensitive = Not[sortcasesensitive];
  1436.     if (nKeepSorted[0] == 1) SortList(filelist,nSortType[0]);
  1437.     if (nKeepSorted[1] == 1) SortList(getlist, nSortType[1]);
  1438.     SetMenuValues();
  1439. }
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448. int mgetabout (VOID)
  1449. {
  1450.     char sAboutText[100];
  1451.  
  1452.     sprintf(sAboutText,"    %s\n\n  by Jeremy Friesner\n  jfriesne@ucsd.edu\n\nCompiled: %s",
  1453.             pnamestring, __DATE__);
  1454.     MakeReq(sAboutText,"About GadMGet","Hey, Cool!");
  1455.         
  1456.     #ifdef OLD
  1457.     strcpy(sAboutText,pnamestring);
  1458.     strcat(sAboutText,"\n\nby Jeremy Friesner\njfriesne@ucsd.edu\n");
  1459.     MakeReq(sAboutText,"About GadMGet","Hey, Cool!");
  1460.     #endif 
  1461.     
  1462.     return(1);
  1463. }
  1464.  
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472. int mgetquit (VOID)
  1473. {
  1474.     done=TRUE;
  1475. }
  1476.  
  1477.  
  1478.  
  1479.  
  1480. int mgetmultiselect(VOID)
  1481. {
  1482. int lin, nSortAtEnd = FALSE;
  1483. struct Node *select_current = filelist->lh_Head, *select_next = NULL;
  1484. char sUpperBuffer[MAXFILELINELENGTH],sUpperSearchString[MAXFILELINELENGTH];
  1485.  
  1486. requesttype = SELECT_REQUESTTYPE;       /* This is a HORRIBLE way to program, but I don't want  */
  1487. lin = mgetfind();                                /* to try to change the parameters since it might screw */
  1488. requesttype = FIND_REQUESTTYPE;            /* up the mget_listview2 functions...                        */
  1489.  
  1490.  if (lin == TRUE) 
  1491.  {
  1492.     SetWaitPointer(mgetWnd);
  1493.     AttachLists(FALSE);
  1494.             
  1495.     if (searchcasesensitive)    
  1496.     {            
  1497.         while (select_current != NULL)
  1498.         {
  1499.             if ((nKeepSorted[1] == TRUE)&&(getlist_length > 240))
  1500.             {
  1501.                   nSortAtEnd = TRUE;                        /* remember to sort when done */
  1502.                   nKeepSorted[1] = FALSE;
  1503.             }       
  1504.  
  1505.             if ((select_current->ln_Name != NULL)&&
  1506.                 (strstr(select_current->ln_Name,sMultiSelect) != 0))
  1507.             {
  1508.                 select_next = select_current->ln_Succ;
  1509.                 TransferToSelected(select_current);
  1510.                 select_current = select_next;
  1511.             }
  1512.             else
  1513.             {
  1514.                 select_current = select_current->ln_Succ; 
  1515.             }
  1516.         }
  1517.     }
  1518.     else
  1519.     {
  1520.         strncpy(sUpperSearchString,sMultiSelect,sizeof(sUpperSearchString));
  1521.         UpperCase(sUpperSearchString);
  1522.         while (select_current != NULL)
  1523.         {
  1524.             if ((nKeepSorted[1] == TRUE)&&(getlist_length > 240))
  1525.             {
  1526.                   nSortAtEnd = TRUE;                        /* remember to sort when done */
  1527.                   nKeepSorted[1] = FALSE;
  1528.             }       
  1529.  
  1530.             if (select_current->ln_Name != NULL)
  1531.             {
  1532.                 strncpy(sUpperBuffer,select_current->ln_Name,sizeof(sUpperBuffer)-1);
  1533.                 UpperCase(sUpperBuffer);
  1534.  
  1535.                 if (strstr(sUpperBuffer,sUpperSearchString) != 0)
  1536.                 {
  1537.                     select_next = select_current->ln_Succ;
  1538.                     TransferToSelected(select_current);
  1539.                     select_current = select_next;
  1540.                 }
  1541.                 else
  1542.                 {
  1543.                     select_current = select_current->ln_Succ; 
  1544.                 }
  1545.             }
  1546.             else
  1547.             {
  1548.                     select_current = select_current->ln_Succ; 
  1549.             }
  1550.         }
  1551.     }
  1552.  
  1553.  if (nSortAtEnd == TRUE)
  1554.  {
  1555.      mgetgetkeep();        /* Sort files now, at the end */
  1556.  }
  1557.  
  1558.  AttachLists(TRUE);
  1559.  ChangeWindowTitle();
  1560.  ClearWaitPointer(mgetWnd);
  1561.  }
  1562. }
  1563.  
  1564.  
  1565.  
  1566.  
  1567.  
  1568. int mgetmultideselect(VOID)
  1569. {
  1570. int lin, nSortAtEnd = FALSE;
  1571. struct Node *select_current = getlist->lh_Head, *select_next = NULL;
  1572. char sUpperBuffer[MAXFILELINELENGTH], sUpperSearchString[MAXFILELINELENGTH];
  1573.  
  1574. requesttype = DESELECT_REQUESTTYPE;       /* This is a HORRIBLE way to program, but I don't want  */
  1575. lin = mgetfind();               /* to try to change the parameters since it might screw */
  1576. requesttype = FIND_REQUESTTYPE;           /* up the mget_listview2 functions...           */
  1577.  
  1578. if (lin == TRUE) 
  1579.  {
  1580.      SetWaitPointer(mgetWnd);
  1581.     AttachLists(FALSE);
  1582.     
  1583.     if (searchcasesensitive)    
  1584.     {
  1585.         while (select_current != NULL)
  1586.         {
  1587.            if ((nKeepSorted[0] == TRUE)&&(filelist_length > 240))
  1588.             {
  1589.                  nSortAtEnd = TRUE;                        /* remember to sort when done */
  1590.                   nKeepSorted[0] = FALSE;
  1591.             }
  1592.  
  1593.             if ((select_current->ln_Name != NULL)&&
  1594.                 (strstr(select_current->ln_Name,sMultiSelect) != 0))
  1595.             {
  1596.                 select_next = select_current->ln_Succ;
  1597.                 TransferToFiles(select_current);
  1598.                 select_current = select_next;
  1599.             }
  1600.             else
  1601.             {
  1602.                 select_current = select_current->ln_Succ; 
  1603.             }
  1604.         }
  1605.     }
  1606.     else
  1607.     {
  1608.         strncpy(sUpperSearchString,sMultiSelect,sizeof(sUpperSearchString));
  1609.         UpperCase(sUpperSearchString);
  1610.         while (select_current != NULL)
  1611.         {
  1612.            if ((nKeepSorted[0] == TRUE)&&(filelist_length > 240))
  1613.             {
  1614.                  nSortAtEnd = TRUE;                        /* remember to sort when done */
  1615.                   nKeepSorted[0] = FALSE;
  1616.             }
  1617.  
  1618.             if (select_current->ln_Name != NULL)
  1619.             {
  1620.                 strncpy(sUpperBuffer,select_current->ln_Name,sizeof(sUpperBuffer)-1);
  1621.                 UpperCase(sUpperBuffer);
  1622.  
  1623.                 if (strstr(sUpperBuffer,sUpperSearchString) != 0)
  1624.                 {
  1625.                     select_next = select_current->ln_Succ;
  1626.                     TransferToFiles(select_current);
  1627.                     select_current = select_next;
  1628.                 }
  1629.                 else
  1630.                 {
  1631.                     select_current = select_current->ln_Succ; 
  1632.                 }
  1633.             }
  1634.             else
  1635.             {
  1636.                     select_current = select_current->ln_Succ; 
  1637.             }
  1638.         
  1639.         }
  1640.     }
  1641.  
  1642.  if (nSortAtEnd == TRUE)
  1643.  {
  1644.      mgetfileskeep();        /* Sort files now, at the end */
  1645.  }
  1646.  
  1647.  AttachLists(TRUE);
  1648.  ChangeWindowTitle();
  1649.  ClearWaitPointer(mgetWnd);
  1650.  }
  1651. }
  1652.  
  1653.  
  1654.  
  1655.  
  1656.  
  1657. int mgetcase (VOID)
  1658. {
  1659. searchcasesensitive = Not[searchcasesensitive];
  1660. SetMenuValues();
  1661. }
  1662.  
  1663.  
  1664.  
  1665.  
  1666. int mgetCD (VOID)
  1667. {
  1668. simplepaths = Not[simplepaths];
  1669. SetMenuValues();
  1670. }
  1671.  
  1672.  
  1673.  
  1674.  
  1675.  
  1676.  
  1677. int mgetfindtop (VOID)
  1678. {
  1679.     mgetfind_findtype = SEARCHTYPE_TOP;
  1680.     mgetfind();
  1681.     mgetfind_findtype = SEARCHTYPE_FORWARD;
  1682.     return(TRUE);
  1683. }
  1684.  
  1685.  
  1686.  
  1687. int mgetfindbottom (VOID)
  1688. {
  1689.     mgetfind_findtype = SEARCHTYPE_BOTTOM;
  1690.     mgetfind();
  1691.     mgetfind_findtype = SEARCHTYPE_FORWARD;
  1692.     return(TRUE);
  1693. }
  1694.  
  1695.  
  1696. int mgetfindback (VOID)
  1697. {
  1698.     mgetfind_findtype = SEARCHTYPE_BACKWARD;
  1699.     mgetfind();
  1700.     mgetfind_findtype = SEARCHTYPE_FORWARD;
  1701.     return(TRUE);
  1702. }
  1703.  
  1704.  
  1705. int mgetfind (VOID)
  1706. {
  1707. ULONG winsig, signals;
  1708. int done = 0, found = 0, index = -1;
  1709. int fwindowwidth = 450, fwindowheight = 35 + Scr->RastPort.TxHeight;
  1710. int fwindowleft = (mgetLeft + (windowwidth/2) - (fwindowwidth/2));
  1711. int fwindowtop  = (mgetTop  + (windowheight/2)- (fwindowheight/2));
  1712. int WindowHeightLines = nTopListHeight/(listfont.ta_YSize);
  1713. struct NewGadget stringGad;
  1714. struct IntuiMessage *imsg;
  1715. struct Gadget *newgad = NULL;
  1716. char numstring[100], *ss = searchstring, sTempOutString[300];
  1717. char *wp = NULL,windowtitlestring0[] = "Search Window", 
  1718.                 windowtitlestring1[] = "Line Length Window",
  1719.                 windowtitlestring2[] = "Output File Change Window",
  1720.                 windowtitlestring3[] = "Select Multiple Items Window",
  1721.                 windowtitlestring4[] = "Deselect Multiple Items Window";
  1722. FILE *fpTemp = NULL;
  1723.  
  1724. findvi  = GetVisualInfo(Scr, TAG_END);
  1725. if (findvi == NULL) return(0);
  1726. if (findwindow != NULL) return(0);
  1727.  
  1728.  
  1729. if (fwindowleft < 0) fwindowleft = mgetLeft;
  1730. if (fwindowheight < 0) fwindowtop = mgetTop;
  1731.  
  1732.  newgad = CreateContext(&findgadlist);
  1733.  if (newgad == 0)
  1734.     {
  1735.     MakeReq("Couldn't create findwindow gad context!\n",NULL,NULL);
  1736.     return(0);
  1737.     }
  1738.  
  1739.  if (newgad == NULL) return(0);
  1740.  
  1741.  stringGad.ng_TextAttr     = &topaz8;    /* Cant figure out how to get system default into a TextAttr!  No name string available! */
  1742.  stringGad.ng_VisualInfo = findvi;
  1743.  stringGad.ng_LeftEdge     = 5;
  1744.  stringGad.ng_TopEdge    = 18 + Scr->RastPort.TxHeight;
  1745.  stringGad.ng_Width     = (fwindowwidth-10);
  1746.  stringGad.ng_Height     = 13;
  1747.  stringGad.ng_GadgetText = "Please enter search string.";
  1748.  stringGad.ng_GadgetID     = 35;    
  1749.  stringGad.ng_Flags     = PLACETEXT_ABOVE;
  1750.  
  1751.  switch (requesttype)
  1752.  {
  1753.      case FIND_REQUESTTYPE:
  1754.         wp = windowtitlestring0;
  1755.    break;
  1756.  
  1757.    case LINELENGTH_REQUESTTYPE:
  1758.          wp = windowtitlestring1;
  1759.          stringGad.ng_GadgetText = "Please enter new maximum line length.";
  1760.          sprintf(numstring,"%i\0",maxoutputlinelength);    
  1761.          ss = numstring;
  1762.    break;
  1763.    
  1764.    case OUTPUTFILE_REQUESTTYPE:
  1765.          wp = windowtitlestring2;
  1766.          stringGad.ng_GadgetText = "Please enter new output file path/device.";
  1767.          sprintf(numstring,"%s",sOutFileName);
  1768.          strncpy(sTempOutString,sOutFileName,sizeof(sTempOutString));
  1769.          ss = sTempOutString;
  1770.    break;
  1771.    
  1772.    case SELECT_REQUESTTYPE:
  1773.        wp = windowtitlestring3;
  1774.        stringGad.ng_GadgetText = "Please enter key string to select files with.";
  1775.        sprintf(numstring,"%s",sMultiSelect);
  1776.          strncpy(sTempOutString,sMultiSelect,sizeof(sTempOutString));
  1777.          ss = sTempOutString;       
  1778.    break;
  1779.    
  1780.    case DESELECT_REQUESTTYPE:
  1781.        wp = windowtitlestring4;
  1782.        stringGad.ng_GadgetText = "Please enter key string to deselect files with.";
  1783.        sprintf(numstring,"%s",sMultiSelect);
  1784.        strncpy(sTempOutString,sMultiSelect,sizeof(sTempOutString));
  1785.        ss = sTempOutString;
  1786.       break;
  1787.  }
  1788.  
  1789.  
  1790.  newgad = CreateGadget(STRING_KIND, newgad, &stringGad, 
  1791.               GTST_String, ss, 
  1792.               STRINGA_Justification, GACT_STRINGCENTER, 
  1793.               GA_Immediate, TRUE,
  1794.               TAG_END);  
  1795.  
  1796.  if (newgad == NULL) 
  1797.  {
  1798.     FreeGadgets(findgadlist);
  1799.     FreeVisualInfo(findvi);
  1800.     return(0);
  1801.  }
  1802.  
  1803.  if (GadToolsBase->lib_Version == 37)
  1804.  {
  1805.     /* Only do it the "illegal" way under v37.  GA_Immediate in the CreateGadget
  1806.        line, above, won't work under v37 but will on later releases. */
  1807.     newgad->Activation |= GACT_IMMEDIATE; 
  1808.  }    
  1809.  
  1810.  switch (screentype)
  1811.  {
  1812.     case USE_PUBSCREEN:
  1813.         findwindow = OpenWindowTags(NULL,
  1814.             WA_Left,        fwindowleft,
  1815.             WA_Top,        fwindowtop,
  1816.             WA_Width,         fwindowwidth,
  1817.             WA_Height,    fwindowheight,
  1818.             WA_PubScreen,    Scr,
  1819.             WA_PubScreenFallBack, TRUE,
  1820.             WA_IDCMP,        STRINGIDCMP|IDCMP_CLOSEWINDOW|
  1821.                         IDCMP_REFRESHWINDOW|IDCMP_ACTIVEWINDOW,
  1822.             WA_Flags,        WFLG_DRAGBAR|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  1823.             WA_Gadgets,    findgadlist,
  1824.             WA_Title,         wp,
  1825.             WA_ScreenTitle,    pnamestring,
  1826.             TAG_DONE );
  1827.     break;
  1828.     
  1829.     case USE_CUSTOMSCREEN:
  1830.         findwindow = OpenWindowTags(NULL,
  1831.             WA_Left,        fwindowleft,
  1832.             WA_Top,        fwindowtop,
  1833.             WA_Width,         fwindowwidth,
  1834.             WA_Height,    fwindowheight,
  1835.             WA_CustomScreen, Scr,
  1836.             WA_IDCMP,        STRINGIDCMP|IDCMP_CLOSEWINDOW|
  1837.                         IDCMP_REFRESHWINDOW|IDCMP_ACTIVEWINDOW,
  1838.             WA_Flags,        WFLG_DRAGBAR|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  1839.             WA_Gadgets,    findgadlist,
  1840.             WA_Title,         wp,
  1841.             WA_ScreenTitle,    pnamestring,
  1842.             WA_CustomScreen,    Scr,
  1843.             TAG_DONE );
  1844.     break;
  1845.  
  1846.     case USE_WBSCREEN:
  1847.         findwindow = OpenWindowTags(NULL,
  1848.             WA_Left,        fwindowleft,
  1849.             WA_Top,        fwindowtop,
  1850.             WA_Width,         fwindowwidth,
  1851.             WA_Height,    fwindowheight,
  1852.             WA_IDCMP,        STRINGIDCMP|IDCMP_CLOSEWINDOW|
  1853.                         IDCMP_REFRESHWINDOW|IDCMP_ACTIVEWINDOW,
  1854.             WA_Flags,        WFLG_DRAGBAR|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  1855.             WA_Gadgets,    findgadlist,
  1856.             WA_Title,         wp,
  1857.             WA_ScreenTitle,    pnamestring,
  1858.             TAG_DONE );
  1859.     break;
  1860.     }
  1861.  
  1862. if (findwindow == NULL) return(0);
  1863. GT_RefreshWindow(findwindow, NULL); 
  1864.  
  1865. SetWindowTitles(mgetWnd, "MGet window inactive--close daughter window to continue", (char *) ~0); 
  1866. SetWaitPointer(mgetWnd);
  1867.  
  1868. winsig = 1 << findwindow->UserPort->mp_SigBit;
  1869.  
  1870.  while (!done)
  1871.  {
  1872.     signals = Wait(winsig);
  1873.     if (signals&winsig)
  1874.     {
  1875.         while ((!done) && (imsg = GT_GetIMsg(findwindow->UserPort)))
  1876.         {
  1877.             
  1878.             switch(imsg->Class)
  1879.             {            
  1880.                 case IDCMP_ACTIVEWINDOW:
  1881.                     ActivateGadget(newgad,findwindow,NULL);
  1882.                     break;
  1883.                         
  1884.                 case IDCMP_GADGETUP:
  1885.                     strncpy(ss,((struct StringInfo*)newgad->SpecialInfo)->Buffer,sizeof(searchstring));
  1886.                     done = 1;
  1887.                     break;
  1888.         
  1889.                 case IDCMP_CLOSEWINDOW:
  1890.                     done = 2;
  1891.                     break;
  1892.                     
  1893.                 case IDCMP_REFRESHWINDOW:
  1894.                     GT_BeginRefresh(findwindow);
  1895.                     GT_EndRefresh(findwindow, TRUE);
  1896.                     break;
  1897.             }
  1898.             GT_ReplyIMsg(imsg);
  1899.         }
  1900.     }
  1901.  }
  1902.     
  1903. CloseWindow(findwindow);
  1904. FreeGadgets(findgadlist);
  1905. FreeVisualInfo(findvi); 
  1906. findwindow = NULL;
  1907.  
  1908. ClearWaitPointer(mgetWnd);
  1909. ChangeWindowTitle();  /* just in case */
  1910.  
  1911.  if ((requesttype == SELECT_REQUESTTYPE)||(requesttype == DESELECT_REQUESTTYPE))
  1912.  {
  1913.      if (strlen(sTempOutString) == 0) return(FALSE);  /* empty string = abort, don't move any items */
  1914.     strncpy(sMultiSelect,sTempOutString,sizeof(sMultiSelect));
  1915.      ChangeWindowTitle();
  1916.      return(TRUE);
  1917.  }
  1918.  
  1919.  if (requesttype == LINELENGTH_REQUESTTYPE) 
  1920.  {
  1921.         ChangeWindowTitle();    
  1922.         return(atoi(ss));
  1923.  }
  1924.  
  1925.  if (requesttype == OUTPUTFILE_REQUESTTYPE)
  1926.  {
  1927.     if (strlen(sTempOutString) == 0)
  1928.     {
  1929.         if (BStartedFromWB == FALSE)
  1930.         {
  1931.             fpOut = stdout;
  1932.             *sOutFileName = CHAR_NUL;    /* blank out filename string */
  1933.         }
  1934.         else
  1935.         {
  1936.             strncpy(sTempOutString,"ram:GadMget.output",sizeof(sOutFileName));
  1937.         }
  1938.     }
  1939.     else
  1940.     {
  1941.         fpTemp = fopen(sTempOutString,"w");
  1942.         if (fpTemp == NULL)
  1943.         {
  1944.             MakeReq("Couldn't open output file!\n",NULL,NULL);
  1945.         }
  1946.         else
  1947.         {
  1948.             fpOut = fpTemp;
  1949.             strncpy(sOutFileName,sTempOutString,sizeof(sOutFileName));
  1950.             fclose(fpTemp);
  1951.         }
  1952.     }
  1953.     ChangeWindowTitle();
  1954.     return(0);
  1955.  }
  1956.     
  1957.  if ((done == 2)||(strlen(searchstring) == 0))
  1958.  {
  1959.     ChangeWindowTitle();
  1960.     return(0);    /* can use searchstring now instead of ss */
  1961.  }            /* because we're no longer worried about the nums */
  1962.  
  1963.  /* Now find it in the filelist */
  1964.  index = SearchList(searchstring,mgetfind_findtype);
  1965.  if (index == -1) DisplayBeep(Scr); else findgadgoto(index,3);
  1966.  return(1);
  1967. }
  1968.  
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974. int mgetfindnext (VOID)
  1975. {
  1976. int next_index;
  1977.  
  1978. /* bump to next node */
  1979. next_index = SearchList(searchstring,SEARCHTYPE_NEXT);
  1980. if (next_index == -1) DisplayBeep(Scr); else findgadgoto(next_index,2);
  1981.  
  1982. return(TRUE);
  1983. }
  1984.  
  1985.  
  1986.  
  1987. int mgetfindprevious (VOID)
  1988. {
  1989. int prev_index;
  1990.  
  1991. /* bump to previous node */
  1992. prev_index = SearchList(searchstring,SEARCHTYPE_PREVIOUS);
  1993. if (prev_index == -1) DisplayBeep(Scr); else findgadgoto(prev_index,2);
  1994.  
  1995. return(TRUE);
  1996. }
  1997.  
  1998. int mgetfindcurrent (VOID)
  1999. {
  2000. if ((search_index == -1)||(search_current == NULL)) DisplayBeep(Scr); else findgadgoto(search_index,2);
  2001.  
  2002. return(TRUE);
  2003. }
  2004.  
  2005.  
  2006. int mgetfilesbydir (void)
  2007. {
  2008. nSortType[0] = SORTBYDIR;
  2009.  
  2010. SortList(filelist,nSortType[0]);
  2011. }
  2012.  
  2013.  
  2014. int mgetfilesbysize (void)
  2015. {
  2016. nSortType[0] = SORTBYSIZE;
  2017.  
  2018. SortList(filelist,nSortType[0]);
  2019. }
  2020.  
  2021.  
  2022. int mgetfilesbyname (void)
  2023. {
  2024. nSortType[0] = SORTBYNAME;
  2025.  
  2026. SortList(filelist,nSortType[0]);
  2027. }
  2028.  
  2029.  
  2030. int mgetfilesbydesc (void)
  2031. {
  2032. nSortType[0] = SORTBYDESC;
  2033.  
  2034. SortList(filelist,nSortType[0]);
  2035. }
  2036.  
  2037. int mgetfilesbyage (void)
  2038. {
  2039. nSortType[0] = SORTBYAGE;
  2040.  
  2041. SortList(filelist,nSortType[0]);
  2042. }
  2043.  
  2044.  
  2045. int mgetfileskeep (void)
  2046. {
  2047. if (nKeepSorted[0] == 1) 
  2048.     {
  2049.         nKeepSorted[0] = 0;
  2050.     }
  2051.     else
  2052.     {
  2053.         nKeepSorted[0] = 1;
  2054.         SortList(filelist,nSortType[0]);
  2055.     }
  2056. SetMenuValues();
  2057. }
  2058.  
  2059.  
  2060. int mgetgetbydir (void)
  2061. {
  2062. nSortType[1] = SORTBYDIR;
  2063.  
  2064. SortList(getlist,nSortType[1]);
  2065. }
  2066.  
  2067.  
  2068. int mgetgetbysize (void)
  2069. {
  2070. nSortType[1] = SORTBYSIZE;
  2071.  
  2072. SortList(getlist,nSortType[1]);
  2073. }
  2074.  
  2075.  
  2076. int mgetgetbyname (void)
  2077. {
  2078. nSortType[1] = SORTBYNAME;
  2079.  
  2080. SortList(getlist,nSortType[1]);
  2081. }
  2082.  
  2083.  
  2084. int mgetgetbydesc (void)
  2085. {
  2086. nSortType[1] = SORTBYDESC;
  2087.  
  2088. SortList(getlist,nSortType[1]);
  2089. }
  2090.  
  2091.  
  2092. int mgetgetbyage (void)
  2093. {
  2094. nSortType[1] = SORTBYAGE;
  2095.  
  2096. SortList(getlist,nSortType[1]);
  2097. }
  2098.  
  2099.  
  2100. int mgetgetkeep (void)
  2101. {
  2102.     if (nKeepSorted[1] == TRUE) 
  2103.     {
  2104.         nKeepSorted[1] = FALSE;
  2105.     }
  2106.     else
  2107.     {
  2108.         nKeepSorted[1] = TRUE;
  2109.         SortList(getlist,nSortType[1]);
  2110.     }
  2111.     SetMenuValues();
  2112. }
  2113.  
  2114.  
  2115.  
  2116.  
  2117.  
  2118. int SearchList(char *key, int nSearchType)
  2119. {
  2120.     int found = 0, nTemp = 0, nSearchDir = SEARCH_FORWARD;
  2121.     char sUpperBuffer[MAXFILELINELENGTH], sUpperSearchString[MAXFILELINELENGTH];
  2122.  
  2123.      pcWhatToAbort = "Search";
  2124.                        
  2125.     /* keep a separate temporary search_* in case we fail */
  2126.     int temp_search_index;
  2127.     struct Node *temp_search_current;
  2128.  
  2129.     if (mgetWnd != NULL) SetWindowTitles(mgetWnd, "Searching...", (char *) ~0); 
  2130.     SetWaitPointer(mgetWnd);
  2131.  
  2132.      /* make sure search_current at least is *something* !! */
  2133.      if (search_current == NULL)
  2134.      {
  2135.         search_current = ListViewTopNode((struct Gadget *) mgetGadgets[0], filelist);
  2136.         search_index = ListViewTop((struct Gadget *) mgetGadgets[0], filelist);
  2137.     }
  2138.  
  2139.     /* temporary copy */
  2140.     temp_search_current = search_current;
  2141.     temp_search_index = search_index;
  2142.     
  2143.     /* Start at current top of display */
  2144.     switch (nSearchType)
  2145.     {
  2146.         case SEARCHTYPE_FORWARD:
  2147.             temp_search_current = ListViewTopNode((struct Gadget *) mgetGadgets[0], filelist);
  2148.             temp_search_index = ListViewTop((struct Gadget *) mgetGadgets[0], filelist);
  2149.             break;
  2150.     
  2151.         case SEARCHTYPE_BACKWARD:
  2152.             temp_search_current = ListViewTopNode((struct Gadget *) mgetGadgets[0], filelist);
  2153.             temp_search_index = ListViewTop((struct Gadget *) mgetGadgets[0], filelist);
  2154.             nSearchDir = SEARCH_BACKWARD;
  2155.             break;
  2156.             
  2157.         case SEARCHTYPE_NEXT:
  2158.             temp_search_current = temp_search_current->ln_Succ;
  2159.             temp_search_index++;
  2160.             break;
  2161.         
  2162.         case SEARCHTYPE_PREVIOUS:
  2163.             if (temp_search_current != filelist->lh_Head) temp_search_current = temp_search_current->ln_Pred;
  2164.                 else temp_search_current = NULL;
  2165.             temp_search_index--;
  2166.             nSearchDir = SEARCH_BACKWARD;
  2167.                 break;
  2168.             
  2169.         case SEARCHTYPE_TOP:
  2170.             temp_search_current = filelist->lh_Head;
  2171.             temp_search_index = 0;
  2172.             break;
  2173.             
  2174.         case SEARCHTYPE_BOTTOM:
  2175.             temp_search_current = TailOf(filelist, &temp_search_index);
  2176.             nSearchDir = SEARCH_BACKWARD;
  2177.             break;        
  2178.     }        
  2179.             
  2180.  
  2181.     if (searchcasesensitive)    
  2182.     {
  2183.         while ((temp_search_current != NULL)&&(found == 0))
  2184.         {
  2185.             if ((temp_search_current->ln_Name != NULL)&&(strstr(temp_search_current->ln_Name,searchstring) != 0))
  2186.             found = 1;
  2187.             else
  2188.             {
  2189.                 if (nSearchDir == SEARCH_FORWARD)
  2190.                 {
  2191.                     temp_search_current = temp_search_current->ln_Succ; 
  2192.                     temp_search_index++;
  2193.                 }
  2194.                 else
  2195.                 {
  2196.                     temp_search_current = temp_search_current->ln_Pred; 
  2197.                     temp_search_index--;
  2198.                 }
  2199.             }
  2200.             if (CheckForUserAbort() == TRUE) temp_search_current = NULL;
  2201.         }
  2202.     }
  2203.     else
  2204.     {
  2205.         strncpy(sUpperSearchString,key,sizeof(sUpperSearchString));
  2206.         UpperCase(sUpperSearchString);
  2207.         while ((temp_search_current != NULL)&&(found == 0))
  2208.         {
  2209.             if (temp_search_current->ln_Name != NULL)
  2210.             {
  2211.                 strncpy(sUpperBuffer,temp_search_current->ln_Name,sizeof(sUpperBuffer)-1);
  2212.                 UpperCase(sUpperBuffer);
  2213.                 if (strstr(sUpperBuffer,sUpperSearchString) != 0) found = 1;
  2214.             }
  2215.             if (found == 0)
  2216.             {
  2217.                  if (nSearchDir == SEARCH_FORWARD)
  2218.                 {
  2219.                     temp_search_current = temp_search_current->ln_Succ; 
  2220.                     temp_search_index++;
  2221.                 }
  2222.                 else
  2223.                 {
  2224.                     if (temp_search_current == filelist->lh_Head) temp_search_current = NULL; 
  2225.                                          else temp_search_current = temp_search_current->ln_Pred; 
  2226.                     temp_search_index--;
  2227.                 }
  2228.             }
  2229.             if (CheckForUserAbort() == TRUE) temp_search_current = NULL;
  2230.         }
  2231.     }
  2232.     
  2233.     ChangeWindowTitle();
  2234.     ClearWaitPointer(mgetWnd);
  2235.  
  2236.     if (found == 1) 
  2237.     {    
  2238.         search_current = temp_search_current;        /* cast the temp copy in stone */
  2239.         search_index = temp_search_index;
  2240.         return(search_index); 
  2241.     }
  2242.     else 
  2243.     {
  2244.         return(-1);
  2245.     }
  2246. }
  2247.  
  2248.  
  2249.  
  2250.  
  2251.  
  2252.  
  2253.  
  2254.  
  2255.  
  2256.  
  2257.  
  2258. void findgadgoto (int index, int numberofflashes)
  2259. {
  2260. int i, xmin, ymin, xmax, ymax, ystep, midscreen;
  2261. int WindowHeightLines = nTopListHeight/(listfont.ta_YSize);
  2262. LONG yTop = 0;
  2263.  
  2264.  midscreen = index-(WindowHeightLines/2);
  2265.  if (midscreen < 0) midscreen = 0;
  2266.  
  2267.  GT_SetGadgetAttrs((struct Gadget *) mgetGadgets[0], mgetWnd, NULL, GTLV_Top, midscreen, TAG_END);
  2268.  yTop = ListViewTop((struct Gadget *) mgetGadgets[0], mgetWnd);
  2269.  ystep = index - yTop;
  2270.   
  2271.  xmin = Scr->WBorLeft + 4;
  2272.  ymin = (nTopListTop + ((listfont.ta_YSize) *ystep) + 2);
  2273.  xmax = windowwidth - Scr->WBorLeft - 20;
  2274.  ymax = ymin + (listfont.ta_YSize) - 1;
  2275.  
  2276.  SetDrMd(mgetWnd->RPort, 50); 
  2277.  for (i=0;i<numberofflashes;i++)
  2278.      {
  2279.      RectFill(mgetWnd->RPort,xmin,ymin,xmax,ymax);
  2280.      Delay(5);
  2281.      RectFill(mgetWnd->RPort,xmin,ymin,xmax,ymax);
  2282.      if (i<(numberofflashes-1)) Delay(5);
  2283.      }
  2284. }
  2285.  
  2286.  
  2287.  
  2288.  
  2289.  
  2290. int ClearList(struct List *thislist)
  2291. {
  2292.     struct Node *current;
  2293.     const int nodesize = sizeof(struct Node);
  2294.     BOOL BOnScreen = ((thislist == filelist)||(thislist == getlist));
  2295.     int nUpdate, nTally = 0;
  2296.         
  2297.     if (thislist == NULL) return(FALSE);
  2298.     if (thislist == filelist) 
  2299.     {
  2300.         search_current = NULL;
  2301.         filelist_length = 0;
  2302.     }
  2303.     if (thislist == getlist)
  2304.     {    
  2305.         getlist_length = 0;
  2306.         kbytes_selected = 0;
  2307.     }        
  2308.     if (BOnScreen == TRUE) AttachLists(FALSE);
  2309.  
  2310.     pcWhatToAbort = "Clear";
  2311.     
  2312.     SetWaitPointer(mgetWnd);
  2313.         
  2314.     while (current = RemHead(thislist))
  2315.     {
  2316.         if (current->ln_Name != NULL)
  2317.         {
  2318.             #ifdef MEMPOOLS_H
  2319.             free(current->ln_Name);
  2320.             #else
  2321.             FreeMem(current->ln_Name,current->ln_Pri+127);
  2322.                         #endif
  2323.         }        
  2324.         #ifdef MEMPOOLS_H
  2325.         free(current);
  2326.         #else                
  2327.         FreeMem(current,nodesize);   
  2328.         #endif
  2329.  
  2330.         if (nUpdate == 0) 
  2331.         {
  2332.             if (CheckForUserAbort() == TRUE) break;
  2333.             if (mgetWnd != NULL) 
  2334.             {
  2335.                 sprintf(windowtitle,"Clearing List: %i",nTally);
  2336.                 SetWindowTitles(mgetWnd, windowtitle, (char *) ~0);
  2337.             }
  2338.         }
  2339.         if (nUpdate < 0) nUpdate = 213;
  2340.         nUpdate--;
  2341.         nTally++;
  2342.         
  2343.     }
  2344.     if (BOnScreen == TRUE) AttachLists(TRUE);
  2345.     ClearWaitPointer(mgetWnd);
  2346.     return(TRUE);
  2347. }
  2348.  
  2349.  
  2350.  
  2351.  
  2352.  
  2353.  
  2354. int mgetclearfiles (void)
  2355. {
  2356.        /* delete files list */
  2357.        ClearList(filelist);    
  2358.        ChangeWindowTitle();
  2359. }
  2360.  
  2361.  
  2362.  
  2363. int mgetclearget (void)
  2364. {
  2365.     /* delete get list */
  2366.     ClearList(getlist);
  2367.        ChangeWindowTitle();
  2368. }
  2369.  
  2370.  
  2371.  
  2372.  
  2373.  
  2374.  
  2375.  
  2376. int mgetnoparse (void)
  2377. {
  2378.     if (noparse) 
  2379.     {
  2380.         noparse = 0; 
  2381.         if (nKeepSorted[0] == 1) SortList(filelist,nSortType[0]);
  2382.         if (nKeepSorted[1] == 1) SortList(getlist, nSortType[1]);
  2383.         SetMenuValues();
  2384.     }
  2385.     else 
  2386.     {
  2387.         noparse = 1;        
  2388.         SetMenuValues();
  2389.     }
  2390. }
  2391.  
  2392.  
  2393.  
  2394.  
  2395.  
  2396.  
  2397.  
  2398.  
  2399. int mgetfiles (void)
  2400. {
  2401.     if (filesflag) 
  2402.     {
  2403.         filesflag = 0;
  2404.         getreadmes = 1;
  2405.         SetMenuValues();     
  2406.     }
  2407.     else filesflag = 1;
  2408. }
  2409.  
  2410.  
  2411.  
  2412.  
  2413.  
  2414.  
  2415.  
  2416. int mgetreadmes (void)
  2417. {
  2418.     if (getreadmes) 
  2419.     {
  2420.         getreadmes = 0; 
  2421.          filesflag = 1;
  2422.          SetMenuValues();
  2423.     }
  2424.     else getreadmes = 1;
  2425. }
  2426.  
  2427.  
  2428.  
  2429.  
  2430.  
  2431.  
  2432. int mgetsplit (void)
  2433. {
  2434.     nosplit = Not[nosplit];
  2435.     SetMenuValues();    
  2436. }
  2437.  
  2438.  
  2439.  
  2440.  
  2441.  
  2442.  
  2443. int mgetlinelength (void)
  2444. {
  2445.     int lin;
  2446.  
  2447.     requesttype = LINELENGTH_REQUESTTYPE;    /* This is a HORRIBLE way to program, but I don't want  */
  2448.     lin = mgetfind();            /* to try to change the parameters since it might screw */
  2449.     requesttype = FIND_REQUESTTYPE;        /* up the mget_listview2 functions...                 */
  2450.  
  2451.     if (lin >  0) maxoutputlinelength = lin;
  2452. }
  2453.  
  2454.  
  2455.  
  2456.  
  2457. int mgetoutputfile (void)
  2458. {
  2459.     int lin;    
  2460.  
  2461.     requesttype = OUTPUTFILE_REQUESTTYPE;    /* This is a HORRIBLE way to program, but I don't want  */
  2462.     lin = mgetfind();            /* to try to change the parameters since it might screw */
  2463.     requesttype = FIND_REQUESTTYPE;        /* up the mget_listview2 functions...            */
  2464. }
  2465.  
  2466.  
  2467.  
  2468.  
  2469.  
  2470. #ifdef DEBUG
  2471. void PrintList(struct List *thislist)
  2472. {
  2473. struct Node *nodecurrent = thislist->lh_Head;
  2474.  
  2475. fprintf(fpOut,"thislist = %p\n",thislist);
  2476.  
  2477.  while (nodecurrent != NULL)
  2478.  {
  2479.     if (nodecurrent->ln_Name == NULL) 
  2480.         fprintf(fpOut,"[ <NULL> ]\n"); 
  2481.     else 
  2482.         fprintf(fpOut,"[%s]\n",nodecurrent->ln_Name);
  2483.  
  2484.     nodecurrent = nodecurrent->ln_Succ;
  2485.  }
  2486.     
  2487. return();
  2488. }
  2489. #endif
  2490.  
  2491.  
  2492.  
  2493.  
  2494. int LengthOfList(struct List *thislist)
  2495. {
  2496.     struct Node *nodecurrent = thislist->lh_Head->ln_Succ;
  2497.     int nLength = 0;
  2498.     
  2499.      while (nodecurrent != NULL)
  2500.      {
  2501.          nLength++;
  2502.         nodecurrent = nodecurrent->ln_Succ;
  2503.      }
  2504.     
  2505.     return(nLength);
  2506. }
  2507.  
  2508.  
  2509.  
  2510.  
  2511. int mgetsave (void)
  2512. {
  2513.     FILE * fpTemp = fpOut;
  2514.  
  2515.     /* Confirm with ASL for really big files! */
  2516.     if (((filelist_length + getlist_length) > 10000) &&
  2517.         (RequestAFile(inputfile,TRUE) == FALSE)) return(FALSE);        
  2518.         
  2519.     fpOut = fopen(inputfile,"w");    
  2520.     if (fpOut == NULL)
  2521.     {
  2522.         MakeReq("Couldn't open file.",NULL,NULL);
  2523.         return (0);
  2524.     }
  2525.  
  2526.     strcpy(windowtitle,"Saving current state to ");
  2527.     strncat(windowtitle,inputfile,sizeof(windowtitle));
  2528.     if (mgetWnd != NULL) SetWindowTitles(mgetWnd, windowtitle, (char *) ~0);            
  2529.  
  2530.     RawOutputList(filelist);
  2531.     
  2532.     if (LengthOfList(getlist) > 0)
  2533.     {
  2534.         fprintf(fpOut,"%s\n",szBookMark);
  2535.         RawOutputList(getlist);
  2536.     }
  2537.     fclose(fpOut);
  2538.     
  2539.     fpOut = fpTemp;
  2540.     
  2541.     ChangeWindowTitle();
  2542. }
  2543.  
  2544.  
  2545. int mgetfastquit (void)
  2546. {
  2547.     CleanUp();
  2548.     exit(0);
  2549. }
  2550.  
  2551.  
  2552. int mgetsaveas (void)
  2553. {
  2554.     /* FileRequest a file */
  2555.     *inputfile = CHAR_NUL;
  2556.     if (RequestAFile(inputfile,TRUE) == FALSE) return(FALSE);
  2557.     
  2558.     mgetsave();
  2559. }
  2560.  
  2561.  
  2562. int mgetmarkexit (void)
  2563. {
  2564.     mgetsave();
  2565.     CleanUp();
  2566.     exit(0);
  2567. }
  2568.  
  2569.  
  2570. /* szFileName string must be readable AND writable! */
  2571. BOOL GetValidFile(char * szFileName)
  2572. {
  2573.     while (FileExists(szFileName) == FALSE)
  2574.      {
  2575.          /* If user aborted, stop trying */
  2576.         if (RequestAFile(szFileName,FALSE) == FALSE) return(FALSE);
  2577.      }
  2578.      SetReqDefaults(szFileName);
  2579.      return(TRUE);
  2580. }
  2581.  
  2582.  
  2583.  
  2584. BOOL FileExists(char * szFileName)
  2585. {
  2586.     FILE * fpTest = fopen(szFileName, "r");
  2587.      if (fpTest != NULL) fclose(fpTest);
  2588.      return(fpTest != NULL);
  2589. }
  2590.  
  2591.  
  2592. int mgetopenfile (void)
  2593. {
  2594.     return(OpenMgetFile(NULL));
  2595. }
  2596.  
  2597. int OpenMgetFile(char * szOptFileName)
  2598. {         
  2599.     /* If arg specified, adopt that */
  2600.     if (szOptFileName == NULL) 
  2601.     {
  2602.          szOptFileName  = inputfile;
  2603.          *szOptFileName = CHAR_NUL;    /* force requester */
  2604.         if (GetValidFile(szOptFileName) == FALSE) return(FALSE); 
  2605.     }
  2606.     else
  2607.         if (FileExists(szOptFileName) == FALSE) return(FALSE);
  2608.  
  2609.     SetReqDefaults(szOptFileName);
  2610.         
  2611.     ClearList(filelist);         
  2612.  
  2613.     /* These are all dependant on a given filelist, so RESET! */
  2614.     filelist_length = 0;
  2615.     search_current = NULL;
  2616.     search_index = 0;
  2617.  
  2618.     pcWhatToAbort = "Load";
  2619.     ReadmyFile(szOptFileName);
  2620.     search_current = NULL;
  2621.     search_index = 0;
  2622.  
  2623.     ChangeWindowTitle();
  2624.     return(1);
  2625. }
  2626.  
  2627.  
  2628.  
  2629. void AttachLists(BOOL BAttach)
  2630. {
  2631.     if (mgetWnd == NULL) return;
  2632.     
  2633.     if (BAttach == TRUE)
  2634.     {
  2635.          GT_SetGadgetAttrs(mgetGadgets[0], mgetWnd, NULL, GTLV_Labels, filelist, TAG_END);
  2636.          GT_SetGadgetAttrs(mgetGadgets[1], mgetWnd, NULL, GTLV_Labels, getlist, TAG_END);        
  2637.     }
  2638.     else
  2639.     {
  2640.          GT_SetGadgetAttrs(mgetGadgets[0], mgetWnd, NULL, GTLV_Labels, ~0, TAG_END);
  2641.          GT_SetGadgetAttrs(mgetGadgets[1], mgetWnd, NULL, GTLV_Labels, ~0, TAG_END);
  2642.     }
  2643. }
  2644.  
  2645.  
  2646.  
  2647.  
  2648. int mgetappend(void)
  2649. {
  2650.     AppendMgetFile(NULL);    
  2651. }
  2652.  
  2653.  
  2654. int AppendMgetFile(char * szOptFileName)
  2655. {
  2656.     int returnme = 0;
  2657.     
  2658.     pcWhatToAbort = "Append";
  2659.  
  2660.     /* If arg specified, adopt that */
  2661.      if (szOptFileName == NULL)
  2662.      {
  2663.          szOptFileName = inputfile;
  2664.          *inputfile = NUL;    /* force requester */
  2665.         if (GetValidFile(szOptFileName) == FALSE) return(FALSE); 
  2666.      }
  2667.      else
  2668.         if (FileExists(szOptFileName) == FALSE) return(FALSE);
  2669.          
  2670.     SetWaitPointer(mgetWnd);
  2671.     SetReqDefaults(szOptFileName);
  2672.  
  2673.  
  2674.      pcWhatToAbort = "Append";
  2675.     returnme = ReadmyFile(szOptFileName);
  2676.     ChangeWindowTitle();
  2677.     return(returnme);
  2678. }
  2679.  
  2680.  
  2681.  
  2682.  
  2683.  
  2684.  
  2685. int mgetCloseWindow (void)
  2686. {
  2687.     done=TRUE;
  2688. }
  2689.  
  2690.  
  2691. int mgeticonify (void)
  2692. {
  2693.     struct MsgPort        *myport  = NULL;
  2694.     struct AppIcon        *appicon = NULL;
  2695.     struct AppMessage    *amsg  = NULL;
  2696.     BOOL BOpen = FALSE;
  2697.     char szPathName[MAXFILENAMELENGTH] = "";
  2698.     char * pcTemp;
  2699.     static char * pcFileName;
  2700.  
  2701.     if (appIconObj == NULL) 
  2702.     {        
  2703.         /* Add path, if there isn't a base in the filename */
  2704.         pcTemp = strchr(pcExecName,':');
  2705.         if (pcTemp == NULL) strcpy(szPathName,"PROGDIR:");        
  2706.                    else pcFileName = pcTemp+1;
  2707.         pcTemp = strchr(pcExecName,'/');
  2708.         if (pcTemp != NULL) pcFileName = pcTemp+1;
  2709.             
  2710.         if (pcFileName == NULL) pcFileName = pcExecName;
  2711.         
  2712.         strncat(szPathName, pcExecName, sizeof(szPathName));
  2713.         appIconObj = GetDiskObjectNew(szPathName);
  2714.         
  2715.         /* backup--use default icon */
  2716.         if (appIconObj == NULL) 
  2717.         {
  2718.             appIconObj = GetDefDiskObject(WBTOOL);
  2719.             if (appIconObj == NULL) return(FALSE);
  2720.         }
  2721.     }
  2722.  
  2723.     /* The type must be set to NULL for an AppIcon */
  2724.     appIconObj->do_Type = 0L;
  2725.     
  2726.     myport = CreateMsgPort();
  2727.     if (myport)
  2728.     {
  2729.         AttachLists(FALSE);
  2730.         appicon = AddAppIconA(0L, 0L, pcFileName, myport, NULL, appIconObj, NULL);
  2731.         if (appicon)
  2732.         {
  2733.             ClosemgetWindow();
  2734.             CloseDownScreen();    /* this handles the workbenchscreen and publicscreen cases too */
  2735.             WaitPort(myport);
  2736.             BOpen = HandleAppEvents(myport);    /* will open screen and window again here */
  2737.             RemoveAppIcon(appicon);
  2738.         }
  2739.         /* Remove any pending messages */
  2740.         while (amsg = (struct AppMessage *) GetMsg(myport)) ReplyMsg((struct Message *)amsg);
  2741.         DeleteMsgPort(myport);
  2742.         AttachLists(TRUE);
  2743.     }
  2744.     ChangeWindowTitle();
  2745.     SetMenuValues();
  2746.     return(1);
  2747. }
  2748.  
  2749.  
  2750.  
  2751.  
  2752.  
  2753.  
  2754.  
  2755. void SetMenuValues (void)
  2756. {
  2757.  struct Menu *currentMenu = mgetMenus;
  2758.  struct MenuItem *currentItem, *currentSub;
  2759.  
  2760.  if (mgetWnd != NULL) ClearMenuStrip(mgetWnd);
  2761.  
  2762.  currentItem = currentMenu->FirstItem;      /* Project Menu -- Open */
  2763.  currentItem = currentItem->NextItem;     /* Append */
  2764.  currentItem = currentItem->NextItem;     /* Save */
  2765.  currentItem = currentItem->NextItem;     /* Save As */
  2766.  currentItem = currentItem->NextItem;     /* Clear  */
  2767.  currentItem = currentItem->NextItem;     /* About */
  2768.  currentItem = currentItem->NextItem;     /* Iconify */
  2769.  if ((IconBase == NULL)||(IconBase->lib_Version < 37))   
  2770.      currentItem->Flags &= ~(ITEMENABLED);
  2771.    else currentItem->Flags |= ITEMENABLED;    
  2772.  
  2773.  
  2774.  /* Make sure the CaseSensitive item in the second menu is checked correctly. */    
  2775.  currentMenu = currentMenu->NextMenu;     /* Search Menu */
  2776.  currentItem = currentMenu->FirstItem;      /* #1 : Find Forward */
  2777.  currentItem = currentItem->NextItem;      /* #2 : Find Backward*/
  2778.  currentItem = currentItem->NextItem;      /* #3 : Find from Top */
  2779.  currentItem = currentItem->NextItem;      /* #4 : Find from Bottom */
  2780.  currentItem = currentItem->NextItem;      /* #5 : Find Next */
  2781.  currentItem = currentItem->NextItem;      /* #5 : Find Previous */
  2782.  currentItem = currentItem->NextItem;     /* #6 : Find Current */
  2783.  currentItem = currentItem->NextItem;     /* #6 : Select */
  2784.  currentItem = currentItem->NextItem;     /* #6 : Deselect */
  2785.  currentItem = currentItem->NextItem;      /* #6 : Case Sensitive. */
  2786.  
  2787.  if (searchcasesensitive)  currentItem->Flags |= CHECKED; 
  2788.             else  currentItem->Flags &= ~(CHECKED);    
  2789.  
  2790.  /* next we do the Sort menu. */
  2791.  currentMenu = currentMenu->NextMenu;
  2792.  if (noparse) currentMenu->Flags &= ~(MENUENABLED);
  2793.        else currentMenu->Flags |= MENUENABLED;
  2794.  
  2795.  currentItem = currentMenu->FirstItem;    /* #1: Files List */
  2796.  currentSub = currentItem->SubItem;    /* #1.1 : By Directory */
  2797.  
  2798.  currentSub = currentSub->NextItem;    /* #1.2 : By Size */
  2799.  
  2800.  currentSub = currentSub->NextItem;    /* #1.3 : By FileName */
  2801.  currentSub = currentSub->NextItem;    /* #1.4 : By Description */
  2802.  currentSub = currentSub->NextItem;    /* #1.5 : By Age */
  2803.  currentSub = currentSub->NextItem;    /* #1.6 : Keep Sorted */
  2804.  if (nKeepSorted[0] == 0) currentSub->Flags &= ~(CHECKED);
  2805.                            else currentSub->Flags |= CHECKED;
  2806.  
  2807.  currentItem = currentItem->NextItem;  /* #2: Get List */
  2808.  currentSub = currentItem->SubItem;    /* #2.1 : By Directory */
  2809.  currentSub = currentSub->NextItem;    /* #2.2 : By Size */
  2810.  currentSub = currentSub->NextItem;    /* #2.3 : By FileName */
  2811.  currentSub = currentSub->NextItem;    /* #2.4 : By Description */
  2812.  currentSub = currentSub->NextItem;    /* #2.5 : By Age */
  2813.  currentSub = currentSub->NextItem;    /* #2.6 : Keep Sorted */
  2814.  if (nKeepSorted[1] == 0) currentSub->Flags &= ~(CHECKED);
  2815.                            else currentSub->Flags |= CHECKED;
  2816.  
  2817.                                       
  2818.  currentItem = currentItem->NextItem;    /* #3: Sort Type */
  2819.  currentSub = currentItem->SubItem;    /* #3.1: Tree Sort */
  2820.  if (nSortAlgorithm == TREESORT) currentSub->Flags |= CHECKED;
  2821.                    else currentSub->Flags &= ~(CHECKED);
  2822.  currentSub = currentSub->NextItem;        /* #3.2: Bubble Sort */
  2823.  if (nSortAlgorithm == BUBBLESORT)   currentSub->Flags |= CHECKED;
  2824.                  else currentSub->Flags &= ~(CHECKED);
  2825.  
  2826.  currentItem = currentItem->NextItem;    /* #4: Case Sensitive */
  2827.  if (sortcasesensitive == FALSE) currentItem->Flags &= ~(CHECKED);
  2828.                                       else currentItem->Flags |= (CHECKED);
  2829.                                         
  2830.                           
  2831.  /* Output menu. */
  2832.  currentMenu = currentMenu->NextMenu;
  2833.  
  2834.  currentItem = currentMenu->FirstItem;        /* #1: Aminet Parse */
  2835.  
  2836.  if (noparse) currentItem->Flags &= ~(CHECKED);
  2837.        else currentItem->Flags |= CHECKED;
  2838.        
  2839.        
  2840.  currentItem = currentItem->NextItem;        /* #2: Get Files */
  2841.  
  2842.  if (noparse) currentItem->Flags &= ~(ITEMENABLED);
  2843.        else currentItem->Flags |= ITEMENABLED;
  2844.  if (filesflag) currentItem->Flags |= CHECKED;
  2845.           else currentItem->Flags &= ~(CHECKED);
  2846.           
  2847.  currentItem = currentItem->NextItem;        /* #3: Get Readmes */
  2848.  if (noparse) currentItem->Flags &= ~(ITEMENABLED);
  2849.        else currentItem->Flags |= ITEMENABLED;
  2850.  if (getreadmes) currentItem->Flags |= CHECKED;
  2851.            else currentItem->Flags &= ~(CHECKED);
  2852.     
  2853.  currentItem = currentItem->NextItem;        /* #4: Split Commands */
  2854.  
  2855.  if (noparse) currentItem->Flags &= ~(ITEMENABLED);
  2856.        else currentItem->Flags |= ITEMENABLED;
  2857.  if (nosplit) currentItem->Flags &= ~(CHECKED);
  2858.            else currentItem->Flags |= CHECKED;
  2859.            
  2860.  
  2861.  currentItem = currentItem->NextItem;        /* #5: Use CD's */
  2862.  if (noparse) currentItem->Flags &= ~(ITEMENABLED);
  2863.        else currentItem->Flags |= ITEMENABLED;
  2864.  if (simplepaths) currentItem->Flags |= CHECKED;
  2865.            else currentItem->Flags &= ~(CHECKED);
  2866.            
  2867.  currentItem = currentItem->NextItem;        /* #6: Line length */
  2868.  if ((noparse)||(nosplit)) currentItem->Flags &= ~(ITEMENABLED);
  2869.        else currentItem->Flags |= ITEMENABLED;
  2870.  
  2871.  ResetMenuStrip( mgetWnd, mgetMenus );                 
  2872. }
  2873.  
  2874.  
  2875.  
  2876.  
  2877.  
  2878.  
  2879. /* Turns all \n's in input string into <space><newline>'s */
  2880. void FindReturns(char *mystring)
  2881. {
  2882.  char *thischar=mystring, *prevchar=mystring;
  2883.  
  2884.  while (*thischar != NULL)
  2885.  {
  2886.     
  2887.     if ( (*prevchar  ==   92) &&                        /* any '/'s ? */
  2888.          ((*thischar ==   78)||(*thischar == 110)) &&      /* N's or n's */
  2889.          (prevchar   !=  NULL) &&                        /* Sanity chk */
  2890.          (thischar   !=  NULL))
  2891.         
  2892.         {
  2893.         *prevchar = CHAR_SPACE;   /* set this to a space--easier than shortening string */
  2894.         *thischar = CHAR_NEWLINE;   /* and end this line with a newline char */
  2895.         }
  2896.     prevchar = thischar;
  2897.     thischar++;
  2898.  }
  2899. }
  2900.  
  2901.  
  2902.  
  2903.  
  2904.  
  2905.  
  2906.  
  2907.  
  2908.  
  2909. int AddFile(struct List *mylist, char *newstring, int stringlength)
  2910. {
  2911.  struct Node *newnode;
  2912.  char *newname;
  2913.  UBYTE diff = MAXFILELINELENGTH;
  2914.  const int minlinelength = 1;
  2915.  
  2916.  if (keepblanklines == 1) minlinelength = 0;
  2917.  if ((newstring == NULL)||((omitcomments == TRUE)&&(*newstring==cCommentChar))) return(0);
  2918.  
  2919. #ifdef MEMPOOLS_H
  2920.  if (!(newnode = (struct Node *) malloc(sizeof(struct Node))))
  2921. #else
  2922.  if (!( newnode = AllocMem(sizeof(struct Node),MEMF_CLEAR) ))
  2923. #endif
  2924.  {
  2925.     /* emergency bailout! */
  2926.     ClearList(filelist); 
  2927.     filelist = NULL;
  2928.     
  2929.     #ifdef MEMPOOLS_H
  2930.         free(filelist);
  2931.     #else
  2932.     FreeMem(filelist,sizeof(struct List));
  2933.     #endif
  2934.     
  2935.     MakeReq("AddFile:  Aborting due to lack of memory",NULL,NULL);
  2936.     CleanUp();
  2937.     exit(20);
  2938.  }
  2939.  
  2940. #ifdef MEMPOOLS_H
  2941.  if (!( newname = (char *) malloc(stringlength+1)))
  2942. #else
  2943.  if (!( newname = AllocMem(stringlength+1,MEMF_CLEAR) ))
  2944. #endif
  2945.  {
  2946.     /* emergency bailout! */
  2947.     #ifdef MEMPOOLS_H
  2948.     free(newnode);
  2949.     #else
  2950.     FreeMem(newnode,sizeof(struct Node));
  2951.     #endif
  2952.     
  2953.     ClearList(filelist); 
  2954.     filelist = NULL;
  2955.     
  2956.     #ifdef MEMPOOLS_H
  2957.     free(filelist);
  2958.     #else
  2959.     FreeMem(filelist,sizeof(struct List));
  2960.     #endif
  2961.     
  2962.     MakeReq("AddFile:  Aborting due to lack of memory",NULL,NULL);
  2963.     CleanUp();
  2964.     exit(20);
  2965.  }
  2966.  memset(newname,CHAR_NUL,stringlength+1);    /* clear bytes--this can probably be removed later */
  2967.      
  2968. strncpy(newname,newstring,stringlength);   /* copy over the bytes */
  2969.  
  2970. newnode->ln_Pri = stringlength - 126;    /* store string length in unused field */
  2971. newnode->ln_Name=newname;          /* and set ze pointer! */
  2972.  
  2973. AddTail(mylist, newnode);
  2974. return(1);
  2975. }
  2976.  
  2977.  
  2978.  
  2979. /* Prints out a file.  Makes sure there is a sEndOfLineString after the end of every line */
  2980. int PrintFile(char *szFileName, int PrintReturnFirst)
  2981. {
  2982.     FILE *input_file = fopen(szFileName,"r");
  2983.     char inputline[MAXFILELINELENGTH], *a, *b;
  2984.     int nLen;
  2985.  
  2986.      if (input_file == NULL) 
  2987.      {
  2988.         return(0);
  2989.      }
  2990.  
  2991.      if (PrintReturnFirst == 1)
  2992.      {
  2993.          fprintf(fpOut,sEndOfLineString);
  2994.          
  2995.      }
  2996.          
  2997.     /* Read until we get a line-end */
  2998.     while(!feof(input_file))
  2999.     {
  3000.         memset(inputline,NUL,MAXFILELINELENGTH);
  3001.         fgets(inputline,MAXFILELINELENGTH,input_file);  /* Read up to MAXFILELINELENGTH chars from inputfile */
  3002.         
  3003.         nLen = strlen(inputline);
  3004.         
  3005.         if (nLen >= 2)
  3006.         {
  3007.             /* make sure that it ends in a sEndOfLineString */
  3008.             a = &inputline[strlen(inputline)-2];
  3009.             b = &inputline[strlen(inputline)-1];
  3010.             
  3011.             if ((*a == '\r')&&(*b == '\n')) /* the easy case */
  3012.             {
  3013.                 fprintf(fpOut,"%s",inputline);
  3014.             }
  3015.             else
  3016.             {
  3017.                 if ((*a != '\r')&&(*b == '\n'))  /* the normal case, for Amigas */
  3018.                 {
  3019.                 /* make the newline a return, and then append a newline */
  3020.                     *b = '\r';
  3021.                     fprintf(fpOut,"%s\n",inputline);
  3022.                 }
  3023.                 else
  3024.                 {
  3025.                 if ((*a == '\r')&&(*b != '\n'))    /* the abnormal case */
  3026.                     {
  3027.                         *b = '\n';
  3028.                         fprintf(fpOut,"%s",inputline);
  3029.                     }
  3030.                     else
  3031.                     {
  3032.                         /* *a != \r, *b != \n */
  3033.                         fprintf(fpOut,"%s%s",inputline,sEndOfLineString);
  3034.                     }
  3035.                 }
  3036.             }
  3037.         }
  3038.         else
  3039.         if (nLen == 1) fprintf(fpOut,sEndOfLineString);
  3040.     }    
  3041.     fclose(input_file);
  3042.     return(1);
  3043. }
  3044.  
  3045.  
  3046. BOOL FillLoadBuffer(FILE * fpIn, UBYTE bWhich)
  3047. {
  3048.     int nBufferSize = nLoadBufferSize/3;
  3049.     int nBytesRead;
  3050.     
  3051.     if (fpIn == NULL) return(FALSE);
  3052.     if (pcEOFat != NULL) return(FALSE);
  3053.     
  3054.     if (bWhich & 0x01)
  3055.     {
  3056.         nBytesRead = fread(szLoadBuffer1, sizeof(UBYTE), nBufferSize, fpIn);
  3057.         /* printf("Filling Buffer 1, (read %i of %i)\n",nBytesRead, nBufferSize);  */
  3058.  
  3059.         if (nBytesRead < nBufferSize)
  3060.         {
  3061.             /* found EOF! */
  3062.             pcEOFat = &szLoadBuffer1[nBytesRead];
  3063.             *pcEOFat = CHAR_NUL;    /* NULL terminate here */
  3064.             return(TRUE);
  3065.         }
  3066.     }
  3067.     
  3068.     if (bWhich & 0x02)
  3069.     {
  3070.         nBytesRead = fread(szLoadBuffer2, sizeof(UBYTE), nBufferSize, fpIn);
  3071.         /* printf("Filling Buffer 2, (read %i of %i)\n",nBytesRead, nBufferSize); */
  3072.         if (nBytesRead < nBufferSize)
  3073.         {
  3074.             /* found EOF! */
  3075.             pcEOFat = &szLoadBuffer2[nBytesRead];
  3076.             *pcEOFat= CHAR_NUL;    /* NULL terminate here */
  3077.             return(TRUE);
  3078.         }
  3079.     }
  3080.  
  3081.     if (bWhich & 0x04)
  3082.     {
  3083.         nBytesRead = fread(szLoadBuffer3, sizeof(UBYTE), nBufferSize, fpIn);
  3084.         /* printf("Filling Buffer 3, (read %i of %i)\n",nBytesRead, nBufferSize); */
  3085.         if (nBytesRead < nBufferSize)
  3086.         {
  3087.             /* found EOF! */
  3088.             pcEOFat = &szLoadBuffer3[nBytesRead];
  3089.             *pcEOFat= CHAR_NUL;    /* NULL terminate here */
  3090.             return(TRUE);
  3091.         }
  3092.     }
  3093.  
  3094.     return(TRUE);
  3095. }
  3096.  
  3097.  
  3098. /* operates much like strchr, only knows to wrap around once. */
  3099. char * FindCharInBuffer(char * szStartAt, char cLookForArg)
  3100. {    
  3101.     register char * pcTemp = szStartAt;
  3102.     register char * szBeganAt = szStartAt;
  3103.     register char cLookFor = cLookForArg;
  3104.     
  3105.     while ((*pcTemp != CHAR_NUL)&&(*pcTemp != cLookFor))
  3106.     {        
  3107.         pcTemp++;
  3108.         if (pcTemp >= szLoadBufferT) pcTemp = szLoadBuffer1;
  3109.         else if (pcTemp == szBeganAt) return(NULL);
  3110.     }
  3111.     return(pcTemp);
  3112. }
  3113.  
  3114.  
  3115.  
  3116. /* Return a pointer to the next sentence in the buffer */
  3117. char * GetMoreText(FILE * fpIn)
  3118. {
  3119.     int nStartPartition=0, nEndPartition=0;
  3120.     char *pcStartOfString; 
  3121.     char *pcEndOfString;
  3122.     static BOOL BThisIsTheLast = FALSE;
  3123.     
  3124.     if (BThisIsTheLast == TRUE)
  3125.     {
  3126.         BThisIsTheLast = FALSE;
  3127.         return(NULL);
  3128.     }
  3129.     
  3130.     
  3131.     /* Make sure we don't go off the end */
  3132.     if (pcLoadCurrent >= szLoadBufferT) pcStartOfString = szLoadBuffer1;
  3133.     
  3134.     /* Get start (first char) and end (nul char) of current string */
  3135.     pcStartOfString = pcLoadCurrent;
  3136.  
  3137.  
  3138.     /* Find the end of the current line */
  3139.     pcEndOfString = FindCharInBuffer(pcStartOfString, CHAR_NEWLINE);
  3140.     if (pcEndOfString == NULL) return(NULL);    /* should never happen! */
  3141.         
  3142.     
  3143.     /* terminate our string */
  3144.     *pcEndOfString = CHAR_NUL;
  3145.     if (*(pcEndOfString-1) == CHAR_RETURN) *(pcEndOfString-1) = CHAR_SPACE;
  3146.  
  3147.     /* If we're at the EOF, then cause the file loading to stop */
  3148.     if (pcStartOfString == pcEOFat) return(NULL);
  3149.     
  3150.     /* If we somehow skip over the EOF, we'll return this line and then 
  3151.        be sure to return NULL next time */
  3152.     if (pcEOFat)
  3153.     {
  3154.         if (((pcStartOfString <= pcEOFat)&&(pcEndOfString >= pcEOFat)) ||
  3155.             ((pcStartOfString >= pcEOFat)&&(pcEndOfString <= pcEOFat)))
  3156.                  BThisIsTheLast = TRUE;
  3157.     }
  3158.     
  3159.     /* Cases:
  3160.     
  3161.         1) Entirely in buffer 1.   Return pointer to string.
  3162.         2) Entirely in buffer 2.    ""
  3163.         3) Entirely in buffer 3.    ""
  3164.         4) In 1 and 2.            "", load buffer 3.  
  3165.         5) In 2 and 3.              "", load buffer 1.
  3166.         6) In 3 and 1.             Copy two pieces to szLoadBufferT, load buffer 2.
  3167.     */
  3168.  
  3169.     
  3170.     /* First figure out which case we're in. */
  3171.     if (pcStartOfString >= szLoadBuffer3) nStartPartition = 3;    
  3172.     else if (pcStartOfString >= szLoadBuffer2) nStartPartition = 2;
  3173.       else if (pcStartOfString >= szLoadBuffer1) nStartPartition = 1;
  3174.  
  3175.     if (pcEndOfString == (szLoadBufferT-1)) nEndPartition = 1;    /* wrap around */
  3176.     else if (pcEndOfString >= szLoadBuffer3) nEndPartition = 3;
  3177.     else if (pcEndOfString >= szLoadBuffer2) nEndPartition = 2;
  3178.     else if (pcEndOfString >= szLoadBuffer1) nEndPartition = 1;
  3179.     
  3180.     /* If start and end aren't in one partition, do extra stuff */
  3181.     if (nStartPartition != nEndPartition)
  3182.     {
  3183.         if ((nStartPartition == 1)&&(nEndPartition == 2)) 
  3184.         {
  3185.             FillLoadBuffer(fpIn, 0x4); 
  3186.         }
  3187.         else if ((nStartPartition == 2)&&(nEndPartition == 3)) 
  3188.         {
  3189.             FillLoadBuffer(fpIn, 0x1);
  3190.         }
  3191.         else if ((nStartPartition == 3)&&(nEndPartition == 1))
  3192.         {
  3193.             FillLoadBuffer(fpIn, 0x2); 
  3194.             *(szLoadBufferT-1) = CHAR_NUL;
  3195.             strncpy(szLoadBufferT,pcStartOfString,MAXFILELINELENGTH);
  3196.             strncat(szLoadBufferT,szLoadBuffer1,MAXFILELINELENGTH);
  3197.             pcStartOfString = szLoadBufferT;
  3198.             *(szLoadBufferT-1) = '~';
  3199.         }
  3200.     }
  3201.  
  3202.     /* Set this to the next string for next time */
  3203.     pcLoadCurrent = pcEndOfString+1;
  3204.     
  3205.     /* return the current string */
  3206.     return(pcStartOfString);
  3207. }
  3208.  
  3209.  
  3210.  
  3211.  
  3212. BOOL SetUpBufferPairs(FILE * fpIn, BOOL BAlloc)
  3213. {    
  3214.     if (BAlloc == TRUE)
  3215.     {
  3216.         /* Allocate memory */
  3217.         while (szLoadBuffer1 == NULL)
  3218.         {
  3219.             szLoadBuffer1 = (char *) malloc(nLoadBufferSize+1+MAXFILELINELENGTH);
  3220.             if (szLoadBuffer1 == NULL) 
  3221.             {    
  3222.                 nLoadBufferSize /= 10;
  3223.                 while ((nLoadBufferSize % 3) != 0) nLoadBufferSize++;
  3224.                 if (nLoadBufferSize < 1024) return(FALSE);
  3225.             }
  3226.         }
  3227.         
  3228.         if (szLoadBuffer1 == NULL) return(FALSE);
  3229.  
  3230.         szLoadBuffer2 = &szLoadBuffer1[nLoadBufferSize/3];
  3231.         szLoadBuffer3 = &szLoadBuffer1[2*nLoadBufferSize/3];
  3232.         
  3233.         szLoadBufferT = &szLoadBuffer1[nLoadBufferSize];
  3234.         *szLoadBufferT = '~';        
  3235.         szLoadBufferT++;        /* start overflow array after NUL */
  3236.         
  3237.         pcLoadCurrent = szLoadBuffer1;
  3238.         pcEOFat = NULL;
  3239.  
  3240.         FillLoadBuffer(fpIn, 0x1|0x2 );
  3241.     }
  3242.     else
  3243.     {
  3244.         /* Free memory, if it's allocated. */
  3245.         if (szLoadBuffer1 != NULL) 
  3246.         {
  3247.             free(szLoadBuffer1);
  3248.             szLoadBuffer1 = NULL;
  3249.             szLoadBuffer2 = NULL;
  3250.             szLoadBuffer3 = NULL;
  3251.             szLoadBufferT = NULL;
  3252.             pcEOFat       = NULL;
  3253.             pcLoadCurrent = NULL;
  3254.         }
  3255.     }
  3256.     return(TRUE);
  3257. }
  3258.  
  3259.  
  3260.  
  3261. /* returns the number of lines successfully parsed and added to the list */
  3262. int ReadmyFile(char * szInFile)
  3263. {
  3264.  FILE *input_file = NULL;
  3265.  char *inputline = NULL;
  3266.  int nStringLength, okline = 0, nUpdate = 50;
  3267.  int filelength = 0, failed_lines = 0;
  3268.  int minlinelength = 1;
  3269.  struct List * thislist = filelist;
  3270.  int nBookMarkLength = strlen(szBookMark);
  3271.  
  3272.  if (keepblanklines == 1) minlinelength = 0;
  3273.  
  3274.  input_file = fopen(szInFile,"r");
  3275.  if (input_file == NULL) return(FALSE);
  3276.  
  3277.  /* Valid file--set this now. */
  3278.  if (szInFile != inputfile) strncpy(inputfile, szInFile, sizeof(inputfile));
  3279.  
  3280.  SetWaitPointer(mgetWnd);
  3281.  
  3282.  SetReqDefaults(szInFile);
  3283.  
  3284.  AttachLists(FALSE);
  3285.  
  3286.  if (SetUpBufferPairs(input_file, TRUE) == FALSE)
  3287.       MakeReq("No memory for load buffers",NULL,NULL);
  3288.    else inputline = "";
  3289.  
  3290.  
  3291.  while (inputline)
  3292.  {
  3293.     filelength++;        
  3294.     okline=0;  
  3295.     /* Read until we get a line-end */
  3296.     while((!okline)&&(inputline))
  3297.     {
  3298.         /* Not necessary, I think: memset(inputline,NUL,MAXFILELINELENGTH); */
  3299.         inputline = GetMoreText(input_file);  /* Read up chars from szInFile buffer */
  3300.         if (inputline != NULL)
  3301.         {
  3302.             nStringLength = strlen(inputline);
  3303.             if ((nStringLength >= minlinelength)&&(nStringLength < MAXFILELINELENGTH)) okline=1;
  3304.         }
  3305.     }
  3306.     
  3307.     if ((inputline)&&((nStringLength < MAXFILELINELENGTH)||(noparse)))
  3308.     {        
  3309.         /* Check to see if we have a szBookMark */
  3310.         if (strncmp(inputline, szBookMark, nBookMarkLength) == 0) thislist = getlist;
  3311.         else
  3312.         {    
  3313.                   if (AddFile(thislist, inputline, nStringLength) == TRUE)
  3314.                   {
  3315.                       if (thislist == filelist) filelist_length++;
  3316.                           else if (thislist == getlist) 
  3317.                           {
  3318.                               if (!noparse) UpdateByteCount(inputline,1);
  3319.                               getlist_length++;
  3320.                           }
  3321.                 if (nUpdate == 0)
  3322.                 {
  3323.                     sprintf(windowtitle,"Loading: %i",filelist_length);
  3324.                     if (mgetWnd != NULL) SetWindowTitles(mgetWnd, windowtitle , (char *) ~0);
  3325.                     nUpdate = 125;
  3326.                     if (CheckForUserAbort() == TRUE) inputline = NULL;
  3327.                 }
  3328.                 else nUpdate--;
  3329.                  }
  3330.                   else failed_lines++;
  3331.         }
  3332.     }
  3333.     else failed_lines++;          
  3334.  }
  3335.  
  3336.  SetUpBufferPairs(input_file, FALSE);
  3337.  fclose(input_file);
  3338.  
  3339.  if ((nKeepSorted[0] == 1)&&(!noparse)) SortList(filelist,nSortType[0]);  /* keep sorted if that is selected! */
  3340.  if ((nKeepSorted[1] == 1)&&(!noparse)) SortList(getlist,nSortType[1]);  /* keep sorted if that is selected! */
  3341.  
  3342.  AttachLists(TRUE);
  3343.  
  3344.  ChangeWindowTitle();
  3345.  ClearWaitPointer(mgetWnd);    
  3346.  return(filelist_length);
  3347. }
  3348.  
  3349.  
  3350.  
  3351.  
  3352.  
  3353.  
  3354. void ChangeWindowTitle(void)
  3355. {
  3356.     char *fstring = inputfile, *f2;
  3357.     char sSubString[60];
  3358.     int charlength = (windowwidth-81)/8 - 40;
  3359.  
  3360.     if (mgetWnd == NULL) return;
  3361.     
  3362.     if (charlength <= 0) 
  3363.     {
  3364.         fstring = sSubString;
  3365.         fstring[0] = NUL;
  3366.     }
  3367.     else
  3368.     if (strlen(fstring) > charlength)
  3369.     {
  3370.         f2 = inputfile + strlen(inputfile) - charlength - 1;    
  3371.         if (f2 > inputfile)
  3372.         {
  3373.             fstring = sSubString;
  3374.             strcpy(fstring,f2);
  3375.         }
  3376.     }    
  3377.     sprintf(windowtitle,"(%s) %i files, %u kilobytes selected.",fstring, getlist_length, kbytes_selected);   
  3378.     SetWindowTitles(mgetWnd, windowtitle , (char *) ~0); 
  3379.     return();
  3380. }
  3381.  
  3382.  
  3383.  
  3384.  
  3385.  
  3386.  
  3387.  
  3388.  
  3389.  
  3390. VOID UpdateByteCount(char *mystring, int addorsub)
  3391. {
  3392.     kbytes_selected = kbytes_selected + (AminetFileSize(mystring) * addorsub);
  3393.     return();
  3394. }
  3395.  
  3396.  
  3397.  
  3398.  
  3399.  
  3400.  
  3401.  
  3402.  
  3403.  
  3404.  
  3405.  
  3406. VOID CleanUp(void)
  3407. {
  3408.  
  3409.  if ((fpOut != stdout)&&(fpOut != NULL)) fclose(fpOut);
  3410.  
  3411.  SetUpBufferPairs(NULL, FALSE);
  3412.  
  3413.  if (appIconObj) FreeDiskObject(appIconObj);
  3414.  
  3415.  if (listfontdata)  CloseFont(listfontdata);
  3416.  if (windowisopen)  {ClosemgetWindow();  windowisopen = FALSE; mgetWnd = NULL;}
  3417.  if (screenisopen)  {CloseDownScreen();  screenisopen = FALSE; Scr = NULL;}
  3418.  if (filelist)        
  3419.  {
  3420.      ClearList(filelist); 
  3421.      #ifdef MEMPOOLS_H
  3422.      free(filelist);
  3423.      #else
  3424.      FreeMem(filelist,sizeof(struct List));
  3425.      #endif
  3426.      
  3427.  }
  3428.  if (getlist) 
  3429.  {
  3430.      ClearList(getlist);
  3431.      
  3432.      #ifdef MEMPOOLS_H
  3433.      free(getlist);
  3434.      #else
  3435.      FreeMem(getlist,sizeof(struct List));
  3436.      #endif
  3437.  }
  3438.  if (WorkbenchBase) CloseLibrary((struct Library *)WorkbenchBase);
  3439.  if (IconBase)      CloseLibrary((struct Library *)IconBase);
  3440.  if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  3441.  if (AslBase)        CloseLibrary((struct Library *)AslBase);
  3442.  if (UtilityBase)   CloseLibrary((struct Library *)UtilityBase);
  3443.  if (GraphicsBase)  CloseLibrary((struct GraphicsLib *)GraphicsBase);
  3444.  if (GadToolsBase)  CloseLibrary((struct Library *)GadToolsBase);
  3445.  return();
  3446. }
  3447.  
  3448.  
  3449.  
  3450.  
  3451.  
  3452.  
  3453.  
  3454.  
  3455.  
  3456.  
  3457.  
  3458. int RequestAFile(char *szBuffer, BOOL BSave)
  3459. {
  3460.     int rvalue = 1;
  3461.     LONG lFlags = FILF_PATGAD;
  3462.     char szOpen[] = "Open", szSave[] = "Save";
  3463.     char * szOkayText = szOpen;
  3464.     char * szHailText = "Select a text file to browse.";
  3465.     
  3466.     if (strlen(defDir) == 0) strcpy(defDir,"ram:");
  3467.     if (strlen(defFile)== 0) strcpy(defFile,"RECENT");
  3468.  
  3469.     SetWaitPointer(mgetWnd);
  3470.  
  3471.     if (BSave == TRUE) 
  3472.     {
  3473.         szHailText = "Select a file to save to.";
  3474.         lFlags |= FILF_SAVE;
  3475.         szOkayText = szSave;
  3476.     }
  3477.     
  3478.     struct TagItem frtags[] =
  3479.     {
  3480.         ASL_Hail,    (ULONG)szHailText,
  3481.         ASL_Height,    350,
  3482.         ASL_Width,    320,
  3483.         ASL_LeftEdge,    50,
  3484.         ASL_TopEdge,    35,
  3485.         ASL_OKText,    (ULONG)szOkayText,
  3486.         ASL_CancelText, (ULONG)"Cancel",
  3487.         ASL_File,    defFile,
  3488.         ASL_Dir,    defDir,
  3489.         ASL_Window,    mgetWnd,
  3490.         ASL_FuncFlags,  lFlags,
  3491.         ASL_Pattern,    szFilePattern,
  3492.         TAG_DONE
  3493.     };
  3494.  
  3495.     struct FileRequester *fr;
  3496.     
  3497.     fr = (struct FileRequester *) AllocAslRequest(ASL_FileRequest, frtags);
  3498.     if (fr == NULL) rvalue = 0;
  3499.             
  3500.      if ((rvalue)&&(AslRequest(fr, NULL)))
  3501.     {
  3502.         strcpy(szBuffer,fr->rf_Dir);
  3503.         strncpy(defDir,fr->rf_Dir,sizeof(defDir));
  3504.         strncpy(defFile,fr->rf_File,sizeof(defFile));
  3505.         if ((defDir[strlen(defDir)-1] != '/')&&
  3506.             (defDir[strlen(defDir)-1] != ':')) strcat(szBuffer,"/");
  3507.         strcat(szBuffer,fr->rf_File);
  3508.     }
  3509.     else rvalue = 0;
  3510.     
  3511.     if (fr != NULL) FreeAslRequest(fr);
  3512.     ClearWaitPointer(mgetWnd);
  3513.     if (rvalue == 1) SetReqDefaults(szBuffer);
  3514.     return(rvalue);
  3515. }
  3516.  
  3517.  
  3518.  
  3519.  
  3520. void SetWaitPointer(struct Window * mywin)
  3521. {
  3522.     if (mywin != NULL) SetPointer(mywin, waitPointer, 16, 16, -6, 0);
  3523. }
  3524.  
  3525. void ClearWaitPointer(struct Window * mywin)
  3526. {
  3527.     if (mywin != NULL) ClearPointer(mywin);
  3528. }
  3529.  
  3530.  
  3531.  
  3532.  
  3533.  
  3534. void TurnOnAllMenuItems(struct Menu *myMenu)
  3535. {
  3536. struct MenuItem *mItem;
  3537.  
  3538.  while (myMenu != NULL)
  3539.     {
  3540.     mItem = myMenu->FirstItem;
  3541.     while (mItem != NULL)
  3542.         {
  3543.         mItem->Flags |= ITEMENABLED;
  3544.         mItem = mItem->NextItem;
  3545.         }
  3546.     myMenu = myMenu->NextMenu;
  3547.     }
  3548. return;
  3549. }
  3550.  
  3551.  
  3552.  
  3553.  
  3554.  
  3555.  
  3556.  
  3557.  
  3558.  
  3559.  
  3560. VOID SetReqDefaults(char *szFilePath)
  3561. {
  3562. char *sFileStart;
  3563.  
  3564.  sFileStart = strrchr(szFilePath,'/');
  3565.  if (sFileStart == NULL)
  3566.      {
  3567.      sFileStart = strrchr(szFilePath,':');
  3568.      if (sFileStart == NULL)
  3569.          {
  3570.          sFileStart = szFilePath;
  3571.          }
  3572.      }
  3573.  
  3574.  if (sFileStart != NULL) strncpy(defFile,sFileStart+(sFileStart != szFilePath),sizeof(defFile));
  3575.  if ((sFileStart != NULL)&&(sFileStart != szFilePath)) strncpy(defDir,szFilePath,(sFileStart - szFilePath) + 1);
  3576.  return();
  3577. }
  3578.  
  3579.  
  3580.  
  3581.  
  3582.  
  3583.  
  3584. VOID UpperCase(char *sOldString)
  3585. {
  3586. char *i = sOldString;
  3587. const int diff = 'a' - 'A';
  3588.  
  3589.  if (sOldString == NULL) return();
  3590.  while (*i != CHAR_NUL)
  3591.  {
  3592.     if ((*i >= 'a')&&(*i <= 'z')) *i = *i - diff;
  3593.     i++;
  3594.  }
  3595. return();
  3596. }
  3597.  
  3598.  
  3599.  
  3600.  
  3601.  
  3602. VOID LowerCase(char *sOldString)
  3603. {
  3604. char *i = sOldString;
  3605. const int diff = 'a' - 'A';
  3606.  
  3607.  if (sOldString == NULL) return();
  3608.  while (*i != CHAR_NUL)
  3609.  {
  3610.     if ((*i >= 'A')&&(*i <= 'Z')) *i = *i + diff;
  3611.     i++;
  3612.  }
  3613.  
  3614. return();
  3615. }
  3616.  
  3617.  
  3618.  
  3619.  
  3620.  
  3621.  
  3622. int mgetoutput(void)
  3623. {
  3624.     FILE *fpTemp = NULL;
  3625.  
  3626.     if (getlist_length > 0) 
  3627.     {
  3628.         /* If no output name given, do default output... */
  3629.          if (strlen(sOutFileName) == 0)
  3630.          {
  3631.              /* for Workbench, absolute default is ram:GadMget.output */
  3632.              if (BStartedFromWB == TRUE)
  3633.              {
  3634.                  fpTemp = fopen("ram:Gadmget.Output","w");
  3635.                  if (fpTemp == NULL) 
  3636.                  {
  3637.                     MakeReq("Error:  Couldn't open ram:GadMget.output for writing!",NULL,NULL);
  3638.                     CleanUp();
  3639.                     exit(10);
  3640.                  }
  3641.              }
  3642.              else
  3643.              {    /* for the CLI, default is stdout */
  3644.                  fpTemp = stdout;
  3645.              }
  3646.          }
  3647.          else
  3648.          {
  3649.             /* open requested output file for writing */
  3650.             fpTemp = fopen(sOutFileName,"w");
  3651.             if (fpTemp == NULL)
  3652.             {
  3653.                 MakeReq("Error:  Couldn't open output file!",NULL,NULL);
  3654.             }
  3655.         }
  3656.             
  3657.          fpOut = fpTemp;
  3658.         PrintFile(szHeaderFile,0);
  3659.         if (noparse) RawOutputList(getlist);
  3660.                    else OutputList(getlist); 
  3661.         PrintFile(szFooterFile,1);
  3662.         if (fpOut != stdout) fclose(fpOut); else fflush(fpOut);
  3663.     }
  3664.     return(0);
  3665. }
  3666.  
  3667.  
  3668.  
  3669. VOID ParseCliArgs(int argc, char *argv[])
  3670. {
  3671.  int nextpasslookfor = 0;
  3672.  FILE *fpTemp = NULL;
  3673.  
  3674.  pcExecName = argv[0];
  3675.  
  3676.  memset(defDir,NUL,sizeof(defDir));
  3677.  memset(defFile,NUL,sizeof(defFile));
  3678.  memset(szHeaderFile,NUL,sizeof(szHeaderFile));
  3679.  memset(szFooterFile,NUL,sizeof(szFooterFile));
  3680.  memset(inputfile,NUL,sizeof(inputfile));
  3681.  
  3682.  if (argc > 1) 
  3683.  {
  3684.      strncpy(inputfile,argv[1],sizeof(inputfile));
  3685.      SetReqDefaults(inputfile);
  3686.  }
  3687.          
  3688.  if (*inputfile == '?')
  3689.  {
  3690.     fprintf(fpOut,"%s",template);
  3691.     CleanUp();
  3692.     exit(0);
  3693.  }
  3694.  
  3695.  for (int i=2; i<=argc; i++)
  3696.  {
  3697.     if (nextpasslookfor == 2)
  3698.     {
  3699.         strncpy(szPubScreenName,argv[i-1],sizeof(szPubScreenName));
  3700.         pubscreenname = szPubScreenName;
  3701.         screentype = USE_PUBSCREEN;
  3702.         continue;            /* skip to next loop */
  3703.     }
  3704.        if (nextpasslookfor == 7)         /* FILE PARAMETER */
  3705.      {
  3706.          strncpy(inputfile,argv[i-1],sizeof(inputfile));
  3707.          SetReqDefaults(inputfile);
  3708.      }
  3709.     if (nextpasslookfor == 9)        /* COMMAND PARAMETER */
  3710.     {
  3711.         strncpy(szCommandString,argv[i-1],sizeof(szCommandString));
  3712.     }
  3713.     if (nextpasslookfor == 16)    /* AMINETPATH PARAMETER */
  3714.     {
  3715.         strncpy(sAminetPathString,argv[i-1],sizeof(sAminetPathString));
  3716.     }
  3717.     if (nextpasslookfor == 17)    /* EOL PARAMETER */
  3718.     {
  3719.         strncpy(sEndOfLineString,argv[i-1],sizeof(sEndOfLineString));
  3720.         EOLParse(sEndOfLineString);
  3721.     }
  3722.     if (nextpasslookfor == 19)    /* COMMENTCHAR PARAMETER */
  3723.     {
  3724.         cCommentChar = *argv[i-1];
  3725.     }
  3726.  
  3727.     
  3728.     UpperCase(argv[i-1]);
  3729.  
  3730.     switch(nextpasslookfor)
  3731.     {    
  3732.     case(1):
  3733.         if (atoi(argv[i-1]) > 0)  maxoutputlinelength = atoi(argv[i-1]);
  3734.         break;
  3735.         
  3736.     /* case 2 is up above, before the Upper() command */
  3737.     
  3738.     case(3):        /* WIDTH PARAMETER */
  3739.         if (atoi(argv[i-1]) > 0)  windowwidth = 155;    /* min level */
  3740.         if (atoi(argv[i-1]) > 155) windowwidth = atoi(argv[i-1]);
  3741.         break;
  3742.     case(4):        /* HEIGHT PARAMETER */
  3743.         if (atoi(argv[i-1]) > 0) windowheight = 167;    /* min level */
  3744.         if (atoi(argv[i-1]) > 167) windowheight = atoi(argv[i-1]);
  3745.         break;
  3746.     case(5):        /* TOP PARAMETER */
  3747.         if (atoi(argv[i-1]) > 0) windowtop = atoi(argv[i-1]);
  3748.         break;
  3749.     case(6):        /* LEFT PARAMETER */
  3750.         if (atoi(argv[i-1]) > 0) windowleft = atoi(argv[i-1]);
  3751.         break;
  3752.         
  3753.     /* Case 7 is up above, before the Upper() command */
  3754.     
  3755.     case(8):        /* OUTPUT PARAMETER */
  3756.         strncpy(sOutFileName,argv[i-1],sizeof(sOutFileName));
  3757.         break;
  3758.     
  3759.     /* Case 9 is up above, before the Upper() command */
  3760.     
  3761.     case(10):        /* HEADER PARAMETER */
  3762.         strncpy(szHeaderFile,argv[i-1],sizeof(szHeaderFile));
  3763.         break;
  3764.         
  3765.     case(11):        /* FOOTER PARAMETER */
  3766.         strncpy(szFooterFile,argv[i-1],sizeof(szFooterFile));
  3767.         break;
  3768.  
  3769.     case(12):        /* FONT PARAMETER */
  3770.         strncpy(sListFontName,argv[i-1],sizeof(sListFontName));
  3771.         LowerCase(sListFontName);
  3772.         if (strstr(sListFontName,".font") == NULL) strncat(sListFontName,".font",sizeof(sListFontName));
  3773.         break;
  3774.         
  3775.     case(13):        /* FONTSIZE PARAMETER */
  3776.         if (atoi(argv[i-1]) > 0) nListFontSize = atoi(argv[i-1]);
  3777.         break;
  3778.     
  3779.     case(14):        /* FILESORT PARAMETER */
  3780.         LowerCase(argv[i-1]);
  3781.         if (strcmp(argv[i-1],"directory") == 0)   nSortType[0] = SORTBYDIR;
  3782.         if (strcmp(argv[i-1],"filename") == 0)    nSortType[0] = SORTBYNAME;
  3783.         if (strcmp(argv[i-1],"size") == 0)        nSortType[0] = SORTBYSIZE;
  3784.         if (strcmp(argv[i-1],"description") == 0) nSortType[0] = SORTBYDESC;
  3785.         if (strcmp(argv[i-1],"age") == 0)       nSortType[0] = SORTBYAGE;
  3786.         break;
  3787.             
  3788.     case(15):        /* GETSORT PARAMETER */
  3789.         LowerCase(argv[i-1]);
  3790.         if (strcmp(argv[i-1],"directory") == 0)   nSortType[1] = SORTBYDIR;
  3791.         if (strcmp(argv[i-1],"filename") == 0)    nSortType[1] = SORTBYNAME;
  3792.         if (strcmp(argv[i-1],"size") == 0)        nSortType[1] = SORTBYSIZE;
  3793.         if (strcmp(argv[i-1],"description") == 0) nSortType[1] = SORTBYDESC;
  3794.         if (strcmp(argv[i-1],"age") == 0)       nSortType[1] = SORTBYAGE;
  3795.         break;
  3796.  
  3797.     /* Case 16 is up above the Upper() command */
  3798.  
  3799.     /* Case 17 is up above the Upper() command */
  3800.     
  3801.     case(18):        /* FILEPAT PARAMETER */
  3802.         strncpy(szFilePattern,argv[i-1],sizeof(szFilePattern));
  3803.         break;
  3804.     
  3805.     /* Case 19 is up above the Upper() command */
  3806.  
  3807.     case(20):        /* LOADBUFFERS PARAMETER */
  3808.         nLoadBufferSize = atoi(argv[i-1]);
  3809.         if (nLoadBufferSize < 1) nLoadBufferSize = 1;
  3810.         nLoadBufferSize *= 1024;
  3811.         while ((nLoadBufferSize % 3) != 0) nLoadBufferSize++;
  3812.         break;
  3813.  
  3814.     case(21):        /* CLOSEACTION PARAMETER */
  3815.         LowerCase(argv[i-1]);
  3816.         if (strcmp(argv[i-1],"save") == 0)   nCloseAction = ACTION_SAVE;
  3817.         if (strcmp(argv[i-1],"output") == 0) nCloseAction = ACTION_OUTPUT;
  3818.         if ((strcmp(argv[i-1],"saveoutput") == 0)||(strcmp(argv[i-1],"outputsave") == 0)) 
  3819.                              nCloseAction = (ACTION_OUTPUT | ACTION_SAVE);
  3820.         if ((strcmp(argv[i-1],"quit") == 0)||(strcmp(argv[i-1],"none") == 0)) 
  3821.                              nCloseAction  = ACTION_NONE;
  3822.         break;
  3823.         
  3824.                         
  3825.     default:
  3826.         /* nothing */
  3827.         break;        
  3828.     }
  3829.     nextpasslookfor = 0;
  3830.     if (strcmp(argv[i-1],"NOAPPWINDOW") == 0)         appwindow = FALSE;
  3831.     if (strcmp(argv[i-1],"SEARCHCASESENSITIVE") == 0) searchcasesensitive = TRUE;    
  3832.     if (strcmp(argv[i-1],"SORTCASESENSITIVE") == 0)   sortcasesensitive= TRUE;    
  3833.     if (strcmp(argv[i-1],"CASESENSITIVE") == 0) 
  3834.     {
  3835.         sortcasesensitive= TRUE;    
  3836.         searchcasesensitive = TRUE;
  3837.     }
  3838.  
  3839.     if (strcmp(argv[i-1],"NOPARSE") == 0)         noparse = TRUE;
  3840.     if (strcmp(argv[i-1],"NOCOMMAND") == 0)     nocommand = TRUE;
  3841.     if (strcmp(argv[i-1],"NOSPLIT") == 0)         nosplit = TRUE;
  3842.     if (strcmp(argv[i-1],"GETREADMES") == 0)     getreadmes = TRUE;    
  3843.     if (strcmp(argv[i-1],"NOCD") == 0)        nocd = TRUE;
  3844.        if (strcmp(argv[i-1],"NOFILES") == 0) 
  3845.        {
  3846.             filesflag  = FALSE;
  3847.             getreadmes = TRUE;
  3848.         }
  3849.      if (strcmp(argv[i-1],"LINELENGTH") == 0)        nextpasslookfor= 1;
  3850.      if (strcmp(argv[i-1],"PUBSCREEN") == 0)        nextpasslookfor= 2;
  3851.     if (strcmp(argv[i-1],"DEFPUBSCREEN") == 0)    screentype = USE_PUBSCREEN;     
  3852.     if ((strcmp(argv[i-1],"WBSCREEN") == 0)||
  3853.         (strcmp(argv[i-1],"WORKBENCHSCREEN") == 0)) screentype = USE_WBSCREEN;
  3854.     if (strcmp(argv[i-1],"NOSIMPLEPATHS") == 0)    simplepaths  = FALSE;    
  3855.     if (strcmp(argv[i-1],"KEEPBLANKLINES") == 0)    keepblanklines = TRUE;
  3856.     if (strcmp(argv[i-1],"KEEPFILESSORT") == 0)     nKeepSorted[0] = TRUE;
  3857.     if (strcmp(argv[i-1],"KEEPGETSORT") == 0)       nKeepSorted[1] = TRUE;
  3858.     if (strcmp(argv[i-1],"OMITCOMMENTS") == 0)      omitcomments = TRUE;
  3859.                                                                                     
  3860.     if (strcmp(argv[i-1],"WIDTH") == 0)    nextpasslookfor = 3;
  3861.     if (strcmp(argv[i-1],"HEIGHT") == 0)    nextpasslookfor = 4;
  3862.     if (strcmp(argv[i-1],"TOP") == 0)    nextpasslookfor = 5;
  3863.     if (strcmp(argv[i-1],"LEFT") == 0)    nextpasslookfor = 6;
  3864.     if (strcmp(argv[i-1],"FILE") == 0)    nextpasslookfor = 7;
  3865.     if (strcmp(argv[i-1],"OUTPUT") == 0)    nextpasslookfor = 8;
  3866.     if (strcmp(argv[i-1],"COMMAND") == 0)    nextpasslookfor = 9;
  3867.     if (strcmp(argv[i-1],"HEADER") == 0)    nextpasslookfor = 10;
  3868.     if (strcmp(argv[i-1],"FOOTER") == 0)    nextpasslookfor = 11;
  3869.     if (strcmp(argv[i-1],"FONT") == 0)      nextpasslookfor = 12;
  3870.     if ((strcmp(argv[i-1],"FONTSIZE") == 0) ||
  3871.         (strcmp(argv[i-1],"SIZE") == 0))    nextpasslookfor = 13;
  3872.     if (strcmp(argv[i-1],"FILESORT") == 0)  nextpasslookfor = 14;
  3873.     if (strcmp(argv[i-1],"GETSORT") == 0)   nextpasslookfor = 15;
  3874.     if (strcmp(argv[i-1],"AMINETPATH") == 0)nextpasslookfor = 16;
  3875.     if (strcmp(argv[i-1],"EOL") == 0)       nextpasslookfor = 17;
  3876.     if ((strcmp(argv[i-1],"FILEPAT") == 0)||
  3877.         (strcmp(argv[i-1],"FILEPATTERN") == 0)) nextpasslookfor = 18;
  3878.     if (strcmp(argv[i-1],"COMMENTCHAR") == 0)   nextpasslookfor = 19;
  3879.     if (strcmp(argv[i-1],"LOADBUFFERS") == 0)   nextpasslookfor = 20;
  3880.     if (strcmp(argv[i-1],"CLOSEACTION") == 0)   nextpasslookfor = 21;
  3881.  }
  3882.  
  3883. return();
  3884. }
  3885.  
  3886.  
  3887.  
  3888.  
  3889.  
  3890.  
  3891.  
  3892.  
  3893.  
  3894.  
  3895. VOID wbmain(struct WBStartup *argv)
  3896. {
  3897.     BStartedFromWB = TRUE;
  3898.     IconBase = OpenLibrary("icon.library",33);
  3899.     if (IconBase == NULL) exit(2);
  3900.     ParseWBArgs(argv);
  3901.     pcExecName = (struct WBStartup *)argv->sm_ArgList->wa_Name;
  3902.     main(0,argv);
  3903. }
  3904.  
  3905.  
  3906.  
  3907.  
  3908.  
  3909.  
  3910.  
  3911.  
  3912. VOID ParseWBArgs(struct WBStartup *argv)
  3913. {
  3914. struct WBArg *wb_arg = argv->sm_ArgList;
  3915. struct DiskObject *dobj;
  3916. char **toolarray, *sTemp;
  3917. FILE *fpTemp = NULL;
  3918.  
  3919.  
  3920. memset(defDir,NUL,sizeof(defDir));
  3921. memset(defFile,NUL,sizeof(defFile));
  3922. memset(szHeaderFile,NUL,sizeof(szHeaderFile));
  3923. memset(szFooterFile,NUL,sizeof(szFooterFile));
  3924.  
  3925.  
  3926. /* Parse the tooltypes from the program file */
  3927. dobj = GetDiskObject(wb_arg->wa_Name);
  3928.  
  3929. if (dobj != NULL)
  3930.  {
  3931.      toolarray = (char **) dobj->do_ToolTypes;
  3932.     if (toolarray != NULL)
  3933.     {
  3934.     
  3935.         if (sTemp = (char *) FindToolType(toolarray,"OUTPUT")) 
  3936.         {
  3937.           strncpy(sOutFileName,sTemp,sizeof(sOutFileName));
  3938.         }
  3939.                                             
  3940.         if (sTemp = (char *) FindToolType(toolarray,"FILE")) 
  3941.         {
  3942.             strncpy(inputfile,sTemp,sizeof(inputfile));
  3943.             SetReqDefaults(inputfile);
  3944.         }
  3945.         if (sTemp = (char *) FindToolType(toolarray,"NOPARSE"))       noparse     = TRUE;
  3946.         if (sTemp = (char *) FindToolType(toolarray,"NOCOMMAND"))      nocommand   = TRUE;
  3947.            if (sTemp = (char *) FindToolType(toolarray,"NOSPLIT"))       nosplit     = TRUE;    
  3948.            if (sTemp = (char *) FindToolType(toolarray,"OMITCOMMENTS"))       omitcomments = TRUE;    
  3949.            if (sTemp = (char *) FindToolType(toolarray,"GETREADMES"))  getreadmes  = TRUE;
  3950.         if (sTemp = (char *) FindToolType(toolarray,"NOFILES"))
  3951.         {
  3952.             filesflag     = FALSE;
  3953.                 getreadmes  = TRUE;
  3954.         }
  3955.            if (sTemp = (char *) FindToolType(toolarray,"LINELENGTH"))
  3956.            {
  3957.                if (atoi(sTemp) > 0)  maxoutputlinelength = atoi(sTemp); 
  3958.            }
  3959.                   
  3960.           if (sTemp = (char *) FindToolType(toolarray,"PUBSCREEN"))   
  3961.           {
  3962.               strcpy(szPubScreenName,sTemp);
  3963.               pubscreenname = szPubScreenName;
  3964.               screentype = USE_PUBSCREEN;
  3965.           }
  3966.           
  3967.           if (sTemp = (char *) FindToolType(toolarray,"NOSIMPLEPATHS"))    simplepaths = FALSE;        
  3968.           if (sTemp = (char *) FindToolType(toolarray,"NOPARSE"))       noparse = TRUE;        
  3969.         if (sTemp = (char *) FindToolType(toolarray,"NOAPPWINDOW"))     appwindow = FALSE;
  3970.         if (sTemp = (char *) FindToolType(toolarray,"WBSCREEN"))      screentype = USE_WBSCREEN;
  3971.         if (sTemp = (char *) FindToolType(toolarray,"WORKBENCHSCREEN")) screentype = USE_WBSCREEN;                                
  3972.         if (sTemp = (char *) FindToolType(toolarray,"NOCD"))        nocd = TRUE;
  3973.         if (sTemp = (char *) FindToolType(toolarray,"KEEPBLANKLINES"))     keepblanklines = TRUE;
  3974.         if (sTemp = (char *) FindToolType(toolarray,"KEEPFILESORT"))     nKeepSorted[0] = TRUE;
  3975.         if (sTemp = (char *) FindToolType(toolarray,"KEEPGETSORT"))     nKeepSorted[1] = TRUE;
  3976.         
  3977.         if (sTemp = (char *) FindToolType(toolarray,"WIDTH"))                             
  3978.         {
  3979.             if (atoi(sTemp) > 0)  windowwidth = 155;    /* min level */
  3980.             if (atoi(sTemp) > 155) windowwidth = atoi(sTemp);
  3981.         }
  3982.         if (sTemp = (char *) FindToolType(toolarray,"HEIGHT"))     
  3983.         {                        
  3984.             if (atoi(sTemp) > 0) windowheight = 167;    /* min level */
  3985.             if (atoi(sTemp) > 167) windowheight = atoi(sTemp);
  3986.         }
  3987.         if (sTemp = (char *) FindToolType(toolarray,"TOP"))                             
  3988.         {
  3989.             if (atoi(sTemp) > 0) windowtop = atoi(sTemp);
  3990.         }
  3991.         if (sTemp = (char *) FindToolType(toolarray,"LEFT"))                             
  3992.         {
  3993.             if (atoi(sTemp) > 0) windowleft = atoi(sTemp);
  3994.         }                    
  3995.         if (sTemp = (char *) FindToolType(toolarray,"SEARCHCASESENSITIVE"))                             
  3996.         {
  3997.             searchcasesensitive = 1;
  3998.         }
  3999.         if (sTemp = (char *) FindToolType(toolarray,"SORTCASESENSITIVE"))                             
  4000.         {
  4001.             sortcasesensitive = 1;
  4002.         }
  4003.         if (sTemp = (char *) FindToolType(toolarray,"CASESENSITIVE"))                             
  4004.         {
  4005.             searchcasesensitive = 1;
  4006.             sortcasesensitive = 1;
  4007.         }
  4008.  
  4009.         if (sTemp = (char *) FindToolType(toolarray,"COMMAND"))
  4010.         {
  4011.             strncpy(szCommandString,sTemp,sizeof(szCommandString));
  4012.         }
  4013.         if (sTemp = (char *) FindToolType(toolarray,"HEADER"))
  4014.         {
  4015.             strncpy(szHeaderFile,sTemp,sizeof(szHeaderFile));
  4016.         }
  4017.         if (sTemp = (char *) FindToolType(toolarray,"FOOTER"))
  4018.         {
  4019.             strncpy(szFooterFile,sTemp,sizeof(szFooterFile));
  4020.         }
  4021.         if (sTemp = (char *) FindToolType(toolarray,"FONT"))
  4022.         {
  4023.             strncpy(sListFontName,sTemp,sizeof(sListFontName));
  4024.             LowerCase(sListFontName);
  4025.             if (strstr(sListFontName,".font") == NULL) strncat(sListFontName,".font",sizeof(sListFontName));
  4026.         }
  4027.         if (sTemp = (char *) FindToolType(toolarray,"FONTSIZE"))
  4028.         {
  4029.             if (atoi(sTemp) > 0) nListFontSize = atoi(sTemp);
  4030.         }
  4031.         if (sTemp = (char *) FindToolType(toolarray,"SIZE"))
  4032.         {
  4033.             if (atoi(sTemp) > 0) nListFontSize = atoi(sTemp);
  4034.         }
  4035.         if (sTemp = (char *) FindToolType(toolarray,"FILESORT"))
  4036.         {
  4037.             LowerCase(sTemp);
  4038.             if (strcmp(sTemp,"directory") == 0)   nSortType[0] = SORTBYDIR;
  4039.             if (strcmp(sTemp,"filename") == 0)    nSortType[0] = SORTBYNAME;
  4040.             if (strcmp(sTemp,"size") == 0)        nSortType[0] = SORTBYSIZE;
  4041.             if (strcmp(sTemp,"description") == 0) nSortType[0] = SORTBYDESC;
  4042.             if (strcmp(sTemp,"age") == 0)           nSortType[0] = SORTBYAGE;
  4043.         }
  4044.         if (sTemp = (char *) FindToolType(toolarray,"GETSORT"))
  4045.         {
  4046.             LowerCase(sTemp);
  4047.             if (strcmp(sTemp,"directory") == 0)   nSortType[1] = SORTBYDIR;
  4048.             if (strcmp(sTemp,"filename") == 0)    nSortType[1] = SORTBYNAME;
  4049.             if (strcmp(sTemp,"size") == 0)        nSortType[1] = SORTBYSIZE;
  4050.             if (strcmp(sTemp,"description") == 0) nSortType[1] = SORTBYDESC;
  4051.             if (strcmp(sTemp,"age") == 0)           nSortType[1] = SORTBYAGE;
  4052.         }    
  4053.                         
  4054.         if (sTemp = (char *) FindToolType(toolarray,"AMINETPATH"))
  4055.             strncpy(sAminetPathString,sTemp,sizeof(sAminetPathString));
  4056.  
  4057.         if (sTemp = (char *) FindToolType(toolarray,"FILEPAT"))
  4058.             strncpy(szFilePattern,sTemp,sizeof(szFilePattern));
  4059.         if (sTemp = (char *) FindToolType(toolarray,"FILEPATTERN"))
  4060.             strncpy(szFilePattern,sTemp,sizeof(szFilePattern));
  4061.  
  4062.         if (sTemp = (char *) FindToolType(toolarray,"EOL"))
  4063.         {
  4064.             strncpy(sEndOfLineString,sTemp,sizeof(sEndOfLineString));
  4065.             EOLParse(sEndOfLineString);
  4066.         }
  4067.         
  4068.         if (sTemp = (char *) FindToolType(toolarray,"COMMENTCHAR"))
  4069.         {
  4070.             cCommentChar = (*sTemp);
  4071.         }                
  4072.         if (sTemp = (char *) FindToolType(toolarray,"LOADBUFFERS"))
  4073.         {
  4074.             nLoadBufferSize = atoi(sTemp);
  4075.             if (nLoadBufferSize < 1) nLoadBufferSize = 1;
  4076.             nLoadBufferSize *= 1024;
  4077.             while ((nLoadBufferSize % 3) != 0) nLoadBufferSize++;
  4078.         }                
  4079.         if (sTemp = (char *) FindToolType(toolarray,"CLOSEACTION"))
  4080.         {
  4081.             LowerCase(sTemp);
  4082.             if (strcmp(sTemp,"save") == 0)   nCloseAction = ACTION_SAVE;
  4083.             if (strcmp(sTemp,"output") == 0) nCloseAction = ACTION_OUTPUT;
  4084.             if ((strcmp(sTemp,"saveoutput") == 0)||(strcmp(sTemp,"outputsave") == 0)) 
  4085.                              nCloseAction = (ACTION_OUTPUT | ACTION_SAVE);
  4086.             if ((strcmp(sTemp,"none") == 0)||(strcmp(sTemp,"quit") == 0))
  4087.                                  nCloseAction  = ACTION_NONE;
  4088.         }
  4089.     }
  4090.  FreeDiskObject(dobj);
  4091.  }
  4092.  
  4093.  /* Get the name of the file extended_clicked, if there is one */
  4094.  if (argv->sm_NumArgs > 1) 
  4095.  {
  4096.     wb_arg++;    /* The first name is the programs name, the 2nd is the proj. icon */
  4097.     if (wb_arg->wa_Name != NULL) 
  4098.     {
  4099.         strncpy(inputfile,wb_arg->wa_Name,sizeof(inputfile));
  4100.         CurrentDir(wb_arg->wa_Lock);
  4101.     }
  4102.  }
  4103.     
  4104. return();
  4105. }
  4106.  
  4107.  
  4108.  
  4109.  
  4110. /* If arg is TRUE, handle via AppWindow, else via AppIcon */
  4111. /* The first file is loaded, the rest are appended */
  4112. BOOL HandleAppEvents(struct MsgPort *msgport)
  4113. {    
  4114.     struct AppMessage * amsg;
  4115.     struct WBArg *argptr = NULL;
  4116.     int nReturn = 0,i;
  4117.     char szFilePath[MAXFILENAMELENGTH];
  4118.     
  4119.     while (amsg = (struct AppMessage *) GetMsg(msgport))
  4120.     {
  4121.         if (screenisopen == 0) 
  4122.         {
  4123.             if (SetupScreen() > 0) 
  4124.             {
  4125.                 printf("GadMget: couldn't reopen screen!\n");
  4126.                 CleanUp();
  4127.                 exit(5);
  4128.             }
  4129.         }
  4130.         
  4131.         if (windowisopen == 0)
  4132.         {
  4133.             if (OpenmgetWindow() > 0)
  4134.             {
  4135.                 printf("GadMget: Couldn't reopen window!\n");
  4136.                 CleanUp();
  4137.                 exit(5);
  4138.             }
  4139.         }
  4140.  
  4141.         
  4142.         /* process messages */
  4143.         if (amsg->am_NumArgs > 0L)
  4144.         {
  4145.             for (i=0;i<amsg->am_NumArgs;i++)
  4146.             {
  4147.                 if (NameFromLock(amsg->am_ArgList[i].wa_Lock, szFilePath, sizeof(szFilePath)))
  4148.                 {
  4149.                     if (szFilePath[strlen(szFilePath)-1] != ':') strncat(szFilePath,"/", sizeof(szFilePath));
  4150.                     strncat(szFilePath, amsg->am_ArgList[i].wa_Name, sizeof(szFilePath));
  4151.                     if (i==0) OpenMgetFile(szFilePath);
  4152.                          else AppendMgetFile(szFilePath);
  4153.                 }
  4154.             }
  4155.         }
  4156.         /* done with message, release it */
  4157.         ReplyMsg((struct Message *)amsg);
  4158.     }
  4159.     return(TRUE);
  4160. }
  4161.  
  4162.  
  4163.  
  4164.  
  4165.  
  4166.  
  4167.  
  4168.  
  4169.  
  4170.  
  4171. /********/
  4172. /* MAIN */
  4173. /********/
  4174. VOID main(int argc, char *argv[])
  4175. {
  4176. FILE *test = NULL;
  4177. ULONG winsig,signals;
  4178.  
  4179. GraphicsBase = OpenLibrary("graphics.library",37);
  4180.  if (GraphicsBase==NULL)
  4181.     {
  4182.     fprintf(fpOut,"couldn't open Graphics.library v37!");
  4183.     CleanUp();
  4184.     return;
  4185.     }
  4186. UtilityBase = OpenLibrary("utility.library",37);
  4187.  if (UtilityBase==NULL)
  4188.     {
  4189.     fprintf(fpOut,"couldn't open utility.library v37!");
  4190.     CleanUp();
  4191.     return;
  4192.     }
  4193. GadToolsBase = OpenLibrary("gadtools.library",37);
  4194.  if (GadToolsBase==NULL)
  4195.     {
  4196.     fprintf(fpOut,"couldn't open gadtools.library v37!\n");
  4197.     CleanUp();
  4198.     return;
  4199.     }
  4200. AslBase = OpenLibrary("asl.library", 37L);
  4201.  if (AslBase == NULL)
  4202.     {
  4203.     fprintf(fpOut,"couldn't open asl.library v37!\n");
  4204.     CleanUp();
  4205.     return;
  4206.     }
  4207. IntuitionBase = OpenLibrary("intuition.library",37);
  4208.  if (IntuitionBase == NULL)
  4209.      {
  4210.      fprintf(fpOut,"Couldn't open intuition.library!\n");
  4211.      CleanUp();
  4212.      return;
  4213.      }
  4214. WorkbenchBase = OpenLibrary("workbench.library",37);
  4215.  if (WorkbenchBase == NULL)
  4216.      {
  4217.      fprintf(fpOut,"Couldn't open workbench.library!\n");
  4218.      CleanUp();
  4219.      return;
  4220.      }
  4221. if (IconBase == NULL)
  4222. {
  4223.     IconBase = OpenLibrary("icon.library",33);
  4224.     /* If it's NULL, we'll disable the iconify function */
  4225. }
  4226.  
  4227.  
  4228. /* construct program name from version string */
  4229. memset(pnamestring,NUL,20);
  4230. strcpy(pnamestring,version+6);
  4231.  
  4232. memset(searchstring,NUL,sizeof(searchstring));
  4233.  
  4234. if (argc>1) ParseCliArgs(argc,argv);
  4235.      
  4236. /* Now add data to listView */
  4237. /* First, initialize List filelist */
  4238.     
  4239. #ifdef MEMPOOLS_H
  4240.  if (!(filelist = (struct List *) malloc(sizeof(struct List))) )
  4241. #else
  4242.  if (!(filelist = AllocMem(sizeof(struct List),MEMF_CLEAR)) )
  4243. #endif
  4244.     {
  4245.     MakeReq("Couldn't create filelist!  Out of memory?",NULL,NULL);
  4246.     CleanUp();
  4247.     return();
  4248.     }
  4249.     
  4250. #ifdef MEMPOOLS_H
  4251.  if (!(getlist = (struct List *) malloc(sizeof(struct List))) )
  4252. #else
  4253.  if (!(getlist = AllocMem(sizeof(struct List),MEMF_CLEAR)) )
  4254. #endif
  4255.     {
  4256.     MakeReq("Couldn't create getlist!  Out of memory?",NULL,NULL);
  4257.     CleanUp();
  4258.     return();
  4259.     }
  4260.     
  4261.  NewList(filelist);
  4262.  NewList(getlist);
  4263.  
  4264.  if ((pcExecName == NULL)||(strlen(pcExecName) == 0)) pcExecName = DEFAULT_EXECNAME;
  4265.  
  4266.  lockscrnerror = SetupScreen();
  4267.  if (lockscrnerror)
  4268.  {
  4269.     if (BStartedFromWB == FALSE) printf("Couldn't open screen!\n",NULL,"Sigh");
  4270.     else
  4271.     MakeReq("Couldn't open screen!",NULL,NULL);
  4272.     
  4273.     CleanUp();
  4274.     return();
  4275.  }
  4276.     
  4277.  winopenerror = OpenmgetWindow();
  4278.  if (winopenerror)
  4279.  {
  4280.     MakeReq("Couldn't open window!",NULL,NULL);
  4281.     CleanUp();
  4282.     return();
  4283.  }
  4284.  
  4285.  if ((OpenMgetFile(inputfile) == TRUE)||(OpenMgetFile(NULL) == TRUE))
  4286.  {
  4287.     /* First, make sure all the menus are enabled. */
  4288.     TurnOnAllMenuItems(mgetMenus);
  4289.     
  4290.     SetMenuValues();
  4291.  
  4292.     if (noparse) SetWindowTitles(mgetWnd, "Please select desired lines now." , (char *) ~0); 
  4293.            else ChangeWindowTitle();
  4294.     
  4295.     while (done==FALSE)
  4296.     {
  4297.         winsig = 1L << mgetWnd->UserPort->mp_SigBit;
  4298.         signals = Wait(winsig|appwinsig);
  4299.         if (signals&winsig) handlereturn = HandlemgetIDCMP(NULL);
  4300.         if (signals&appwinsig) HandleAppEvents(awport);
  4301.     }
  4302.     if (windowisopen)  ClosemgetWindow();
  4303.     if (screenisopen)  CloseDownScreen();
  4304.     
  4305.     if (nCloseAction & ACTION_SAVE)   mgetsave();
  4306.     if (nCloseAction & ACTION_OUTPUT) mgetoutput();    
  4307.  }
  4308.  CleanUp();
  4309.         
  4310.  exit(0);    
  4311. }
  4312.  
  4313. #endif
  4314.  
  4315.  
  4316.